我尝试使用ostream将32位整数写入文件。我正在使用<<操作者:
ostream file;
map<unsigned char, int32_t> histogram;
//…
file << reinterpret_cast<char*>(&histogram[i]);
它的效果很好,除了最后一个数字(在我的情况下11328,二进制为40 2C 00 00),但只有40 2C被写入文件。
它是相同的数字,但是当我再次导入文件时,我想假设每个数字都以32位编码。
我做错了什么?
答案 0 :(得分:4)
您正在使用operator<<(ostream&, const char *)
重载来明显不 C风格的以空字符结尾的字符串,这会导致未定义的行为。 1 < / p>
在40 2C 00 00
的情况下,函数将零字节解释为空终止符,因此它只打印前两个字节。
如果需要二进制I / O,请使用ostream::write()
。 <<
用于格式化的 I / O.
1)更准确地说,只要整数的最后一个字节不为零,你就处于未定义行为的状态 - 即,每当打印出你要打印的所有4个字节时。 子>
答案 1 :(得分:0)
当你使用file << reinterpret_cast<char*>(&histogram[i]);
时,它实际上认为你想输出一个C风格的字符串。因此,当遇到&#39; \ 0时,它将停止输出。所以你的结果是40 2C。
您可以在stdio.h中尝试fwrite()
函数。