使用ifstream将二进制数据读入struct

时间:2014-03-05 08:25:52

标签: c++ struct binary ifstream

我正在尝试使用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));
    
  3. 我的问题是,这里发生了什么使得这两种方法返回不同的结果?

2 个答案:

答案 0 :(得分:1)

正如上面的评论所述,您可能缺少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;
}

答案 1 :(得分:0)

也可以一步读取结构。

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