Linux下C++将二进制数写入文件时出现异常结果
问题根源分析
你现在的问题出在错误地把ASCII形式的二进制字符串当成了二进制数据写入。bitset<32>(number).to_string()生成的是由字符'0'和'1'组成的字符串,每个字符占1个字节(比如'0'对应ASCII码0x30,'1'对应0x31)。当你把这个字符串写入文件时,实际上写入了32个ASCII字节,而不是你期望的4字节原始二进制整数。
举个例子:输入8时,生成的字符串是"00000000000000000000000000001000",写入文件后这32个字符会占用32字节,而不是4字节的0x08 0x00 0x00 0x00(小端模式)或者0x00 0x00 0x00 0x08(大端模式)。
修正后的代码
直接将整数的原始二进制数据写入文件即可,不需要转成字符串:
#include <fstream> #include <cstdio> // 用于remove函数 #include <iostream> void writeToBinaryFile(int number){ // 移除旧文件:如果文件不存在,remove会返回非0值,但不影响后续操作 remove("path/fileToWriteTo.img"); // 以二进制模式打开文件 std::ofstream output("path/fileToWriteTo.img", std::ios::binary); if (output.is_open()) { // 直接写入int的原始二进制数据,sizeof(int)确保写入4字节(通常平台下) output.write(reinterpret_cast<const char*>(&number), sizeof(int)); output.close(); } else { // 添加错误处理,避免静默失败 std::cerr << "Error: Failed to open the file for writing!" << std::endl; } }
额外补充说明
- 如果需要跨平台统一字节序(比如强制大端模式),可以手动转换整数的字节顺序后再写入,避免不同CPU架构的字节序差异:
#include <arpa/inet.h> // Linux下用于htonl函数 // ... int bigEndianNum = htonl(number); // 将主机字节序转换为网络字节序(大端) output.write(reinterpret_cast<const char*>(&bigEndianNum), sizeof(int)); - 永远记得检查文件是否成功打开,路径错误、权限不足等问题都可能导致写入失败,提前处理能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者MMMMMCK
相关产品推荐
相关产品推荐

