将一组整数写入 std::ofstream 并能够读取它们。

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读取它们时(期望得到我写的内容),我得到了非常奇怪的值。我做错了什么?

还是说,我应该在添加完每个数字后将' '(空格)放入流中以分隔它们?

谢谢。


6
你是否认为ios::binary会使得流输出整数的二进制形式,而不是ASCII码?(我之前也有这种误解。) - Emile Cormier
2个回答

5
您正在使用 operator<<(),该运算符将格式化文本输出到流中。因此,您会将纯文本写入二进制文件,这有点违背了以二进制模式写入的目的。尝试在文本编辑器中打开输出文件,您就可以自己看到了。
您有两个选择:要么以文本模式编写并使用空格分隔值(因为在使用格式化输出时,以二进制模式写入是具有误导性的),要么使用流的write()方法进行强制转换。
f.write(reinterpret_cast<char*>(&k), sizeof(int));
// ...
f.read(reinterpret_cast<char*>(&k), sizeof(int));

我个人更喜欢以文本方式编写代码。这意味着代码更加清晰简洁,输出文件也更加便携。如果必须的话,可以压缩文件。


3

operator<<产生格式化文本作为输出,因此,你需要在数字之间放置某种空格来将它们分开。否则,它们都会组成一个巨大的数字字符串,并且当你读取它们时,它将继续将数字作为数字的一部分读取,直到溢出——例如,如果你写了1三次,它将被读回为111


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接