Dan*_*Dan 7 c++ binary struct ifstream
我正在尝试使用 ifstream 从文件中读取二进制数据。
具体来说,我试图用从文件中读取的数据填充这个“标题”结构:
struct Header {
char id[16];
int length;
int count;
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我以这种方式读取文件,结果正是我想要的:
input.read((char*)&hdr, sizeof(hdr));
Run Code Online (Sandbox Code Playgroud)但是,如果我改为手动读取结构的每个变量,结果是乱码:
input.read((char*)&hdr.id, sizeof(hdr.id));
input.read((char*)&hdr.length, sizeof(hdr.length));
input.read((char*)&hdr.count, sizeof(hdr.count));
Run Code Online (Sandbox Code Playgroud)我的问题是,这里发生了什么使这两种方法返回不同的结果?
正如上面的评论所述,您可能缺少 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;
}
Run Code Online (Sandbox Code Playgroud)
小智 8
也可以一步读取结构体。
IE fh.read((char*)&h, sizeof(Header));