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 を計算すると、常にバイナリ ファイルの最後の値を読み取っています。