将整数写入std :: ofstream并能够读回它们

时间:2010-03-19 14:43:18

标签: c++ integer ofstream

我需要在二进制模式下向std::ofstream写一堆无符号整数:

std::ofstream f;
f.open("some path", std::ios::out | std::ios::binary);
// some loop
{
  unsigned int k = get_k(); // may product numbers from 0 to 65535
  f << k;
}
f.close();

它们被“按原样”写入输出文件,没有任何分隔符。因此,当我尝试使用std::ifstream读取它们(希望得到我写的内容)时,我会得到非常奇怪的值。我做错了什么?

或者我应该在添加任何数字之后将' '(空格)放到流中以分隔它们?

感谢。

2 个答案:

答案 0 :(得分:4)

您正在使用operator<<()将格式化文本输出到流中。因此,您将明文写入二进制文件,这有点破坏了以二进制模式编写的目的。尝试在文本编辑器中打开输出文件并亲自查看。

您有两种选择:以文本模式写入并使用空格分隔您的值(因为在使用格式化输出时以二进制模式写入会产生误导),或者使用流的write()方法进行转换。 / p>

f.write(reinterpret_cast<char*>(&k), sizeof(int));
// ...
f.read(reinterpret_cast<char*>(&k), sizeof(int));

我个人更喜欢用文字模式写作。这意味着拥有更清晰的代码和便携式输出文件。如果必须,可以压缩文件。

答案 1 :(得分:3)

operator<<生成格式化文本作为其输出,所以是的,您需要在数字之间放置某种空格来分隔它们。否则,它们将一起运行成一个巨大的数字串,当你再读回它们时,它将继续读取数字作为数字的一部分直到它溢出 - 例如如果你写了1三次,它会以111的形式回读。