当向fstream写入整数时,c++ Last Number仅为2字节而不是4字节
C++ Last Number is only 2bytes instead of 4 when writing integer to fstream
我尝试使用ostream写入32位整数到文件。我用<<接线员:
ostream file;
map<unsigned char, int32_t> histogram;
//…
file << reinterpret_cast<char*>(&histogram[i]);
除了最后一个数字(在我的例子中是11328,即二进制中的40 2C 00 00)之外,它工作得很好,但是只有40 2C被写入文件。
它是相同的数字,但是当我要再次导入文件时,我想假设每个数字都以32位编码。
我做错了什么?
您正在使用operator<<(ostream&, const char *)
过载的东西显然是不是一个c风格的空终止字符串,这导致未定义的行为1
在40 2C 00 00
的情况下,该函数将零字节解释为空终止符,因此它只打印前两个字节。
当您需要二进制I/O时,使用ostream::write()
。<<
用于格式化的 I/o。
1)更准确地说,当整数的最后一个字节不为零时,您就处于未定义行为区-即,无论何时打印出您想要打印的所有4个字节。
当你使用file << reinterpret_cast<char*>(&histogram[i]);
时,事实上,它认为你想输出一个C风格的字符串。因此当遇到' '时,它将停止输出。所以你的结果是402c。
您可以在stdio.h中尝试fwrite()
函数
相关文章:
- 如何仅为一个函数添加延迟
- 如何在连接器 C++ 中将原始字节转换为字符串
- 在 Linux 中,uint32_t从 4 个字节更改为 6 个字节
- C++ CUDA:如何将字节表示为字符或字符集?
- 仅为C++文件(.h、.cpp、.cxx、.c)生成标记文件
- 为什么我得到长度仅为 3 的字符串排列的输出?
- 复制后删除原始数组指针将前 3 个字节设置为 0
- 仅为从某种语言编译的对象添加链接库?
- 将字节打印为长字节
- 是否强制转换void**并将第一个字节设置为nullptr
- 将 char[] 数组转换为字节,然后将字节转换为 int,反之亦然
- 此代码中的双精度仅为 6 位
- 如何在 c++ 中将字节转换为 ASCII 十六进制表示形式?
- OPENSSL 将二进制字节转换为 SHA256 C++
- 仅为特定条件重置变量的值,并为其他所有条件重置固定值
- 我想将四个字节合并为一个数字以进行串行传输
- 仅为某些模板专用化定义转换运算符:预期类型/预期类型说明符
- 如何仅为源代码的特定部分打开 -mavx2
- 为什么以下程序中的输出为 12 字节,而总大小仅为 6 位
- 当向fstream写入整数时,c++ Last Number仅为2字节而不是4字节