C++使用ifstream读取二进制hex文件时无法识别0d字节问题求解
解决方案
- 首先修正文件打开参数,显式指定读模式+二进制模式,避免部分STL实现默认参数异常:
把原ifstream构造行替换为:std::ifstream input(argv[1], std::ios::in | std::ios::binary); - 替换迭代器读取逻辑为更可靠的
read方法,避免STL迭代器实现差异导致的字符隐式转换问题:
完整的读取代码参考如下:#include <fstream> #include <vector> #include <cstdio> int main(int argc, char** argv) { if (argc < 2) return 1; std::ifstream input(argv[1], std::ios::in | std::ios::binary); if (!input.is_open()) { printf("open file failed\n"); return 1; } // 获取文件总大小 input.seekg(0, std::ios::end); const std::streamsize file_size = input.tellg(); input.seekg(0, std::ios::beg); // 预分配缓冲区 std::vector<unsigned char> buffer(file_size); // 一次性读取全部内容 input.read(reinterpret_cast<char*>(buffer.data()), file_size); // 验证读取字节数和文件大小一致 printf("read size: %lld, file size: %lld\n", (long long)input.gcount(), (long long)file_size); // 校验是否存在0d字节 size_t od_count = 0; for (size_t i = 0; i < buffer.size(); i++) { if (buffer[i] == 0x0d) od_count++; } printf("0d byte count: %zu\n", od_count); return 0; } - 排查过往方法失败的原因:
- 用C语言
fgets、fread时如果没有指定rb二进制打开模式,Windows平台会默认以文本模式打开,自动将\r\n转换为\n,丢弃0x0d字节 - 之前用迭代器构造vector的逻辑在部分旧版STL实现中存在字符类型转换的隐式坑,改用
read直接读取原始字节可完全规避该问题
- 用C语言
- 额外验证步骤:
先对比打印出的读取字节数和系统中文件的实际大小,如果两者一致说明数据已经全部读入缓冲区,此时再遍历查找0x0d字节即可,不存在丢失问题。
内容的提问来源于stack exchange,提问作者Taki
相关产品推荐
相关产品推荐

