如何将含元素计数的二进制文件读取到C++的unsigned int向量中?
二进制文件读取问题的解决思路
恢复文件指针位置
你调用seekg(0, ifs.end)后,文件指针停在文件末尾,此时直接执行read会读取不到任何数据。必须先将指针移回文件开头:ifs.seekg(0, ifs.beg);正确解析元素总数与数据
文件前4字节是元素总数,不能直接用文件总大小除以4来计算元素数量,正确流程是:- 先读取前4字节获取元素总数:
uint32_t elem_count; ifs.read(reinterpret_cast<char*>(&elem_count), sizeof(elem_count)); - 根据总数初始化vector,再读取后续的所有数据:
vector<unsigned int> buf(elem_count); ifs.read(reinterpret_cast<char*>(buf.data()), elem_count * sizeof(unsigned int));
- 先读取前4字节获取元素总数:
添加读取校验
每次读取操作后,检查流的状态,避免因文件损坏、字节数不足导致的错误:if (!ifs) { cerr << "文件读取失败" << endl; // 这里可以添加错误处理逻辑,比如返回或终止 }处理字节序差异(可选)
如果二进制文件的字节序(比如大端)和当前系统字节序(比如小端)不一致,需要对读取到的数值进行字节序转换。例如手动实现大端转小端:uint32_t swap_endian(uint32_t val) { val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0x00FF00FF); return (val << 16) | (val >> 16); }读取后调用这个函数转换
elem_count和每个buf中的元素即可。
内容的提问来源于stack exchange,提问作者AmiablePrism30
相关产品推荐
相关产品推荐

