C++使用std::ios::binary写二进制文件却输出ASCII字符问题求助
问题解答:std::ios::binary模式写入文件仍为ASCII内容的原因
核心原因
你对std::ios::binary标记的作用存在误解:这个标记的唯一作用是关闭文本模式下的平台特殊转换逻辑,比如Windows下换行符\n转\r\n、特殊字符当做文件结束符处理的逻辑,它不会改变你写入数据本身的内容。
你当前代码里定义的数组:
char list[6] = {'1', '2', '3', '4', '5','6'};
存储的本身就是字符1到6对应的ASCII编码值(分别为十六进制的0x31到0x36),myFile.write是直接把这段内存的字节原封不动写入文件,所以最终文件内容自然就是ASCII格式的123456,和是否开启std::ios::binary没有关系。
修复方案
如果你要写入数值1到6的二进制字节,直接把数组内容替换为数值本身即可:
// 要用无符号char存储字节数值,避免符号位带来的异常 unsigned char list[6] = {1, 2, 3, 4, 5, 6};
修改后写入文件的就是十六进制为0x01到0x06的二进制字节,用文本编辑器打开会显示为不可打印的控制字符,符合你预期的二进制格式效果。
二进制读写注意事项
- 写入多字节类型(比如
int、float、自定义结构体)时需要注意大小端问题,不同平台的字节序可能存在差异,读写两端要保持统一的字节序规则 std::ofstream::write是纯内存字节拷贝,不会做任何类型转换,内存中存储的内容和写入文件的内容完全一致- 写入自定义结构体时要注意内存对齐带来的填充字节问题,必要时需要关闭编译器的内存对齐选项,避免读写时出现内容偏移
内容的提问来源于stack exchange,提问作者Man of Steam
相关产品推荐
相关产品推荐

