C++如何读取存储深度图的.dat二进制文件并转换为double数组
问题原因
你之前的代码输出乱码是因为直接把二进制读取的char缓冲区当做ASCII字符串输出,而文件存储的是int类型的宽高元数据和double类型的深度数值,本身就不是可打印的文本内容,自然会显示乱码。
正确实现步骤
- 第一步:先读取文件头的两个
int数据,分别对应高度(Height)和宽度(Width) - 第二步:根据读取到的宽高计算总深度数据量,申请对应大小的
double数组/向量 - 第三步:读取剩余所有二进制内容到
double数组中即可 - 注意:如果文件存储的字节序和你运行设备的字节序不一致,还需要做字节序转换,默认字节序匹配的情况下可以使用以下代码:
#include <iostream> #include <fstream> #include <vector> int main() { // 二进制方式打开目标文件 std::ifstream ifs(L"D:\\kek\\DepthMap_10.dat", std::ios::binary); if (!ifs.is_open()) { std::cout << "文件打开失败" << std::endl; return -1; } // 读取头部元数据:高度、宽度,两个均为int类型 int height = 0, width = 0; ifs.read(reinterpret_cast<char*>(&height), sizeof(int)); ifs.read(reinterpret_cast<char*>(&width), sizeof(int)); // 申请对应大小的double数组存储深度值,用vector自动管理内存 std::vector<double> depth_map(height * width); // 批量读取所有深度数据 ifs.read(reinterpret_cast<char*>(depth_map.data()), depth_map.size() * sizeof(double)); // 测试输出前10个深度值验证结果 for (int i = 0; i < 10; ++i) { std::cout << depth_map[i] << std::endl; } // 后续按行访问规则:第row行第col列的深度值为 depth_map[row * width + col] ifs.close(); return 0; }
注意事项
如果运行后读取到的宽高明显不符合预期(比如数值过大/过小),大概率是存储字节序和当前设备的字节序不匹配,需要对读取到的height、width和每个double值做字节序翻转处理。也可以增加ifs.gcount()判断实际读取的字节数和需要读取的字节数是否一致,避免文件损坏导致的异常。
内容的提问来源于stack exchange,提问作者Daria
相关产品推荐
相关产品推荐

