代码之家  ›  专栏  ›  技术社区  ›  Dan

使用ifstream将二进制数据读取到结构中

  •  10
  • Dan  · 技术社区  · 10 年前

    我正在尝试使用ifstream从文件中读取二进制数据。

    具体来说,我试图用从文件读取的数据填充这个“Header”结构:

    struct Header {
        char id[16];
        int length;
        int count;
    };
    
    1. 现在,如果我以这种方式读取文件,结果正是我想要的:

      input.read((char*)&hdr, sizeof(hdr));
      
    2. 但如果我改为手动读取结构的每个变量,结果就是乱码:

      input.read((char*)&hdr.id,     sizeof(hdr.id));
      input.read((char*)&hdr.length, sizeof(hdr.length));
      input.read((char*)&hdr.count,  sizeof(hdr.count));
      

    我的问题是,这里发生了什么使这两个方法返回不同的结果?

    2 回复  |  直到 10 年前
        1
  •  11
  •   Marcel Zebrowski    6 年前

    也可以在一个步骤中读取结构。

    fh.read((char*)&h, sizeof(Header));

        2
  •  8
  •   Blaz Bratanic    10 年前

    如上所述,您可能缺少hdr.length和hdr.count。 我用gcc 4.8和clang 3.5进行了测试,结果正确。

    #include <iostream>
    #include <fstream>
    
    #pragma pack(push, r1, 1)
    struct Header {
        char id[15];
        int length;
        int count;
    };
    #pragma pack(pop, r1)
    
    int main() {
      Header h = {"alalalala", 5, 10};
    
      std::fstream fh;
      fh.open("test.txt", std::fstream::out | std::fstream::binary);
      fh.write((char*)&h, sizeof(Header));
      fh.close();
    
      fh.open("test.txt", std::fstream::in | std::fstream::binary);
    
      fh.read((char*)&h.id, sizeof(h.id));
      fh.read((char*)&h.length, sizeof(h.length));
      fh.read((char*)&h.count, sizeof(h.count));
    
      fh.close();
    
      std::cout << h.id << " " << h.length << " " << h.count << std::endl;
    }