1

バイナリファイルへの書き込みと読み戻しに非常に苦労しています。私は基本的にこの形式のレコードを書いています

1234|ABCD|efgh|IJKL|ABC

このレコードを書き込む前に、このレコード全体の長さを書き込みます (次に、次のようにusing string.size())使用してバイナリ ファイルにレコードを書き込みます。ofstream

int サイズ;

ofstream studentfile;
studentfile.open( filename.c_str(),ios::out|ios::binary );
studentfile.write((char*)&size,sizeof(int));
     studentfile.write(data.c_str(),(data.size()*(sizeof(char))));
     cout << "Added " << data << " to " << filename << endl;
     studentfile.close();

そして、私はこのデータを別の場所で読みました

ifstream ifile11;
     int x;
     std::string y;
     ifile11.open("student.db", ios::in |ios::binary);
     ifile11.read((char*)&x,sizeof(int));
     ifile11.read((char*)&y,x);
     cout << "X " << x << " Y " << y << endl;

まず、レコードの長さを変数 x に読み込み、次にレコードを文字列 y に読み込みます。問題は、出力が x を '0' として示し、'y' が空であることです。

私はこれを理解することができません。この問題を調べて洞察を提供できる人に感謝します。

ありがとうございました

4

2 に答える 2

0

私は自分自身の質問に答えていることを知っていますが、この情報がすべての人に役立つと強く感じています. ほとんどの場合、ヨアヒムの答えは正しく、機能します。ただし、私の問題の背後には 2 つの主な問題があります。

1. The Dev-C++ compiler was having a hard time reading binary files.

2. Not passing strings properly while writing to the binary file, and also reading from the file. For the reading part, Joachim's answer fixed it all.

Dev-C++ IDE は役に立ちませんでした。バイナリ ファイルからデータを誤って読み取ってしまい、temp_buffer を使用することさえせずに読み取ってしまいました。Visual C++ 2010 Express はこのエラーを正しく識別し、実行時例外をスローして誤解を招かないようにしました。すべてのコードを新しい VC++ プロジェクトに取り込むとすぐに、適切にエラー メッセージが表示されたので、すべてを修正することができました。

したがって、このような実際の問題に遭遇したくない場合を除き、Dev-C++ を使用しないでください。また、文字列を読み取ろうとするときは、ヨアヒムの答えが理想的な方法です。

于 2013-09-21T06:55:03.483 に答える