3

尽管我尽了最大的努力,但我似乎无法在这里找到错误。我正在向 ofstream 写入一个向量。该向量包含二进制数据。然而,由于某种原因,当一个空白字符(0x10、0x11、0x12、0x13、0x20)应该被写入时,它被跳过了。

我尝试过使用迭代器和直接的 ofstream::write()。

这是我正在使用的代码。我已经注释掉了我尝试过的其他一些方法。

void
write_file(const std::string& file,
           std::vector<uint8_t>& v)
{
  std::ofstream out(file, std::ios::binary | std::ios::ate);

  if (!out.is_open())
    throw file_error(file, "unable to open");

  out.unsetf(std::ios::skipws);

  /* ostreambuf_iterator ...
  std::ostreambuf_iterator<char> out_i(out);
  std::copy(v.begin(), v.end(), out_i);
  */

  /* ostream_iterator ...
  std::copy(v.begin(), v.end(), std::ostream_iterator<char>(out, ""));
  */

  out.write((const char*) &v[0], v.size());
}

编辑:以及读取它的代码。

void
read_file(const std::string& file,
          std::vector<uint8_t>& v)
{
  std::ifstream in(file);
  v.clear();

  if (!in.is_open())
    throw file_error(file, "unable to open");

  in.unsetf(std::ios::skipws);

  std::copy(std::istream_iterator<char>(in), std::istream_iterator<char>(),
      std::back_inserter(v));
}

这是一个示例输入:

30 0 0 0 a 30 0 0 0 7a 70 30 0 0 0 32 73 30 0 0 0 2 71 30 0 0 4 d2

这是我读回来时得到的输出:

30 0 0 0 30 0 0 0 7a 70 30 0 0 0 32 73 30 0 0 0 2 71 30 0 0 4 d2

如您所见, 0x0a 被省略了,表面上是因为它是空格。

任何建议将不胜感激。

4

4 回答 4

1

您忘记在 read_file 函数中以二进制模式打开文件。

于 2012-02-16T12:23:10.550 回答
1

而不是直接写 vector<>boost::serialization是一种更有效的方法,使用boost::archive::binary_oarchive.

于 2012-02-16T14:55:10.243 回答
0

我认为'a'被视为新行。我仍然必须考虑如何解决这个问题。

于 2012-02-16T04:59:44.160 回答
0

istream_iterator 按设计跳过空格。尝试用这个替换你的 std::copy :

std::copy(
    std::istreambuf_iterator<char>(in),
    std::istreambuf_iterator<char>(),
    std::back_inserter(v));

istreambuf_iterator 直接转到 streambuf 对象,这将避免您看到的空白处理。

于 2014-02-24T09:00:02.860 回答