You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:24:02