std::当在256字节边界上写入整数时,流的奇怪行为
std::ofstream weird behavior when writing integers on byte border from 256
Tring创建了一个二进制文件格式,但行为怪异。
std::ofstream outputFile;
outputFile.open (PATH, std::ios_base::out | std::ios_base::binary |
std::ios_base::app);
unsigned long long int timer3 = 255;
outputFile <<reinterpret_cast<const char *>(&timer3);
timer3 = 256;
outputFile <<reinterpret_cast<const char *>(&timer3);
timer3 = 257;
outputFile <<reinterpret_cast<const char *>(&timer3);
timer3 = 258;
outputFile <<reinterpret_cast<const char *>(&timer3);
二进制输出文件仅包含(十六进制(FF 01 01 02 01
FF-255
01 01-257
02 01-258
为什么它公然无视256(以及5121024..(?
将整数一个接一个地写入二进制的最佳方法是什么?
通过使用格式化的插入运算符<<
并给它一个const char*
,您告诉流您给它的是一个C字符串,即一个以null结尾的字节序列,将被解释为字符。
但事实并非如此。
事实上,任何带有"null"组件的long long
值(任何设置为零的字节(都将终止该格式化插入。
否则<<
怎么知道何时停止?
您应该使用outputFile.write(...)
,因为这就是"原始"字节直接插入流的方式。
outputFile.write(reinterpret_cast<const char *>(&timer3), sizeof(timer3));
请注意,除非您在文件中写入一些指示符,以告诉读者写入了哪些endianness值,否则您将永远无法再次明确地读取它们。(然而,对于一个幼稚的、不可移植的应用程序来说,这可能不是一个考虑因素。(
使用流运算符(<<
(将char*
写入文件时,它会在第一次终止NULL(=0(时停止。
Little Endian中的255将被转换为0xff 0 0 0,因此它只写入0xff
256将被转换为0 0x01 0,因此它被认为是一个空字符串,因为它以0开头。
257将被转换为0x01 0x01 0,因此它将被正确打印。
第一个字节为0的任何数字(例如512768、1024都是256的乘积(都不会用您的方法打印(在Windows和Linux等小终结点机器上(,因为第一个字节是0。
相关文章:
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 当在带有Eigen的C++中使用GDB时,我如何才能看到更多的大矩阵
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当在C++中找到所需的行时,如何从文件中获取接下来的 n 行
- 一个32位版本的应用程序,建立在CentOS 6 x64上,当在较新的Linux上启动时,在"dl_itera
- 当在基类中定义枚举时,qml中的Q_ENUM未定义值
- 当 ||在 std::atomic 中使用运算符代替 &&?
- 当在循环中使用时,std::shared_ptr 对该循环的矢量化有任何影响吗?
- 额外的字节是否在C++中初始化为 0?
- 当在另一个范围中,将SelfAdjointeigensolver保存为成员的结果被重新引入
- 仅当在客户端部署时,QT 5.9的SSL握手问题
- 当在QTableView上丢失焦点时,失去背景颜色
- 当在函数调用中递增值时,程序正常工作,但是如果我们在单独的行中增加值而不是呼叫函数,则会出现错误.为什么
- 当在其他地方使用相同的互斥锁时,等待/通知unique_lock互斥锁是否安全lock_guard
- 当在PCL中添加输入点cloud到OctReepointCloud的点时遇到了APORT()错误
- qt -lnk2019当在类的成员函数中使用名称空间的函数时
- usleep vs std::this_thread::sleep_for,当在 Linux 串行端口上写入/读取时
- 当在Python中定义__str__时,如何将C 的标准全局函数覆盖
- 当在网络字节顺序中放置双精度时,为什么它是在 4 字节块中完成的
- 当在串行端口中接收到字节时发出信号