3

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我得到了非常奇怪的值。我做错了什么?

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

谢谢。

4

2 回答 2

5

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

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

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

我个人更喜欢以文本模式写作。这意味着拥有更简洁的代码和可移植的输出文件。如果必须,您可以压缩文件。

于 2010-03-19T15:39:42.577 回答
3

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

于 2010-03-19T15:04:27.483 回答