0
void updatebfile(char filename[MAX])
{

fstream writereadb;

char cont='y';
char filenameb [MAX];
int i=1;
int record;

student s;

strcpy(filenameb,filename);
strcat(filenameb,".dat");

writereadb.open(filenameb,ios::in | ios::out | ios::binary  );


cout<<"------------------------------"
    <<endl;

cout<<"Begin updating of binary file "
    <<filenameb
    <<endl
    <<endl;

cout<<"Information for student file"
    <<endl
    <<endl;


while ( writereadb.read (reinterpret_cast <char *>(&s), sizeof (s) ) )
{

    cout<<i
        <<'\t'
        <<s.identity
        <<" "
        <<s.name
        <<endl;

    i++;


}

do
{


cout<<endl
    <<"Update record: ";
cin>>record;

cout<<endl
    <<"Student id: ";



writereadb.seekg ((record - 1) * sizeof(s), ios::beg);//problem is here
writereadb.read (reinterpret_cast <char *>(&s), sizeof (s));//always reading last value


cout<<s.identity
    <<endl;





cout<<"Update the name: ";
cin>>s.name;



writereadb.seekp((record-1)*sizeof(student),ios::beg);  
writereadb.write (reinterpret_cast <const char *>(&s), sizeof (s));

cout<<"Any more update (y/n) :";
cin>>cont;

}while (cont=='y');

writereadb.close();







}

バイナリファイルを更新すると思われるこの単純な関数があります。問題は、get ポインターを設定できないように見えることです。s.identity を計算すると、常にバイナリ ファイルの最後の値を読み取っています。

4

1 に答える 1

2

常に 1 つのエントリを読み取ろうとし、それが成功した場合にのみ結果を使用します (これはまったく正しいことです)。EOF に遭遇したなどの理由で成功しなかった場合、streamstate は「fail」に設定されます。これにより、読み取りループが終了しますが、ストリーム状態を明示的にリセットするまで、そのファイル ストリームに対する後続の操作も失敗します。writereadb.clear()したがって、そのループの後に呼び出す必要があります。

その他の注意事項:

  • a を渡してchar filename[MAX]も配列は関数に渡されません! 代わりに、 と同じですchar* filename。つまり、そのパラメータを変更すると、呼び出し元の関数で可視になります。を使用std::stringし、それらのメンバー関数を使用しc_str()て、のポインターを取得しますfstream
  • 最後の値を読み取っていません。読み取れませんでした! あなたのコードはそれを検出したはずです。また、一時構造体を再利用しているため、最後の値を読み取ったようです。一般に、変数のスコープのサイズをできるだけ小さく保つことをお勧めします。関数の先頭ですべての変数を宣言する習慣は、C コードでは必要でしたが、C++ コードでは必要でなかった昔 (前世紀) に属しています。この場合、プログラム全体を 2 つまたは 3 つの関数に分割することも想像できます。
  • ファイルへの構造体のダンプは、異なるコンピューター間では移植できません。同じコンピューター上の異なるコンパイラーでさえ移植できない場合があります。そのため、これを正しく行うシリアル化ライブラリが複数あります。
于 2013-01-13T09:46:27.880 に答える