2

C ++でバイナリの読み取りと書き込みオブジェクトを見てきましたが、いくつかの問題があります。それは「機能します」が、さらにエラー/「情報」の膨大な出力が得られます。

私がやったことは

Person p2;

std::fstream file;
file.open( filename.c_str(), std::ios::in | std::ios::out | std::ios::binary );
file.seekg(0, std::ios::beg );
file.read ( (char*)&p2, sizeof(p2));
file.close();
std::cout << "Name: " << p2.name;

string namePerson は、 andを含む単純な構造体ですint age。プログラムを実行すると、ファイルに書き込むプログラムを既に作成しているため、「Name: Bob」が出力されます (そのため、オブジェクトは既にファイル名に含まれています)。

名前の出力に加えて、以下も出力します。

* glibc が検出されました *プログラム: double free og 破損 (fastttop): ***

バックトレース:

...

メモリーマップ:

...

アボート

4

5 に答える 5

3

Person構造体の名前文字列は文字配列またはSTL文字列ですか?データ形式はシリアル化できないため(ポインタを含む)、STL文字列の上にデータをバイナリで読み取ることによってSTL文字列を入力することはできません。

于 2010-03-04T13:45:42.693 に答える
1

情報をファイルに書き込む方法と、構造体がどのようにPerson構築されるかを見るのは興味深いでしょう。
ファイルがプレーンテキストであることに問題がない場合は、string::c_str()(const char* を返す) を使用してファイルに書き込み、itoa()またはitoa_s()整数を char* として取得することをお勧めします。

Person で 1 つまたは複数のコンストラクターを使用することもできます。

Person(const std::string& name, int age);  
Person(const char* name, int age);

次に、ファイルからデータを抽出するときに、そのデータを使用してコンストラクターを呼び出すだけです。

于 2010-03-04T13:57:21.640 に答える
0

p2.nameはchar*であり、ポインター値が指しているものではなく、ポインター値を読み書きしています。または、p2.nameは、同じ問題で内部ポインタを使用しているstd::stringなどのより複雑な型です。

クラスのシリアル化には、メモリ表現をダンプするだけでなく、多くの作業が必要になることがよくあります。

于 2010-03-04T13:47:14.810 に答える
0

バイナリ IO を使用する場合、サイズを固定する必要があります。ここで STL 文字列を使用すると、STL 文字列のサイズが任意であるため、問題が発生します。

于 2010-03-04T14:40:59.380 に答える
0

あなたは Person オブジェクトをファイルに書き込んだと言いました。ダンプ ツールを使用して、ファイルの内容が期待どおりかどうかを確認しようとしましたか?

また、文字列を使用する代わりに、通常の文字を使用しようとしましたか (@bdk が指摘したように) ?

于 2010-03-04T13:54:11.440 に答える