2017-03-02 47 views
1

我正在学习C++中的二进制文件。我有一个关于在二进制文件中读写结构或类的问题。例如,如果我有这样的结构,将结构保存在二进制文件中并只读取C++中的值

struct A { 
    char a1; 
    int a2; 
    double a3; 
}; 

,然后我可以节省的结构与代码一样,

A a = {'a', 2, 3.5}; 
ofstream file; 
file.open("file.dat", ios::binary); 
file.write((char*)&a, sizeof(a)); 
file.close(); 

的问题是,我可以读不整的结构,但只有结构中的价值?例如,如果我想读取结构的整数值,那么,

ifstream file; 
int i = 1; 
file.open("file.dat", ios::binary); 
file.seekg(sizeof(char), ios::beg); 
file.read((char*)&i, sizeof(i)); 
file.close(); 

这可能吗?如果不是,有没有办法只读取结构的一个值?

+0

结构不对齐的,所以你应该保持一致, –

+0

有结构成员之间的填充。 'a2'与结构的起始位置偏移4,而不是假设偏移1。使它成为'file.seekg(offsetof(A,a2),ios :: beg);'。毕竟,阅读整个结构可能会更容易。 –

+0

二进制文件通常取决于平台。研究“Endianess”。而且,指针不可移植,特别是在同一个可执行文件的调用之间。 –

回答

0

查看我的二进制可移植性材料以获取有关二进制文件及其问题的一般想法。

即使您打算在同一个程序中再次读取它,将整个结构写入磁盘也是一个坏主意。但是,如果你这样做,你可以在磁盘上创建一个二进制映像。你可以记录。它将由char字节,各种大小的大或小的endian整数,指针(对你完全无用)以及浮点类型的双精度和浮点数组成。

一旦你知道了格式,你可以轻松地阅读它。对整数做这个有点棘手,同时避免算术溢出。浮点值非常困难。但是,该网站的代码可以让您轻松读取浮点数据。

紧跟着fread()的fwrite()将会起作用,直到编译器更改其结构布局策略。但是由于转移到了64位,所以现在一直在这么做。

https://github.com/MalcolmMcLean/ieee754