2017-03-02 67 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(); 

これは可能ですか?そうでない場合は、構造体の1つの値だけを読み取る方法はありますか?

+0

あなたがそれを揃える必要がありますので、構造は、構造体のメンバ間のパディングがあります –

+0

、整列していません。 'a2'は構造体の先頭からオフセット4にあり、あなたが想定しているようにオフセット1ではありません。それを 'file.seekg(offsetof(A、a2)、ios :: beg);'にしてください。結局のところ、構造全体を読み込む方が簡単かもしれませんが。 –

+0

バイナリファイルは通常プラットフォームに依存します。 "Endianess"を研究する。また、ポインタは移植可能ではありません。特に、同じ実行可能ファイルの呼び出し間では移植性がありません。 –

答えて

0

バイナリファイルとその問題について一般的な考えを得るために、バイナリの移植性の資料を確認してください。

構造全体をディスクに書き込むことは、同じプログラム内でもう一度読み込んでも構いません。しかし、そうしなければならない場合は、ディスク上にバイナリイメージを作成します。それを記録することができます。 charバイト、さまざまなサイズの大きなエンディアンまたは小さなエンディアン整数、ポインター(あなたにとって全く役に立たない)、浮動小数点型の倍数と浮動小数点数で構成されます。

フォーマットがわかったら、ポータブルで読むことができます。算術オーバーフローを避けながら、整数に対してこれを行うのはややこしいことです。浮動小数点値は非常に困難です。しかし、このサイトには浮動小数点データを移植可能なコードがあります。

コンパイラがその構造レイアウトポリシーを変更するまで、fwrite()に続けてfread()が機能します。しかし、それは64ビットへのシフトのために、今は常に嫌われている。

https://github.com/MalcolmMcLean/ieee754

関連する問題