2009-05-03 15 views
0

バイナリモードでファイルの一部を置き換える際に問題があります。何らかの理由で、私のseekp()行がファイルポインタを目的の位置に置いていません。今は、ファイルの最後に新しい部分を追加します。バイナリモードでファイルの一部を置き換えるseekp()の問題

long int pos; 
bool found = false; 
fstream file(fileName, ios::binary|ios::out|ios::in); 

file.read(reinterpret_cast<char *>(&record), sizeof(Person)); 

while (!file.eof()) 
{ 
    if (record.getNumber() == number) { 
     pos=file.tellg(); 
     found = true; 
     break; 
} 

// the record object is updated here 

file.seekp(pos, ios::beg); //this is not placing the file pointer at the desired place 
file.write(reinterpret_cast<const char *>(&record), sizeof(Person)); 
cout << "Record updated." << endl; 
file.close(); 

私は何か間違っていますか?

ありがとうございます。

答えて

1

あなたのwhile()ループがどのように機能するかわかりません。一般的には、eof()をテストするのではなく、読み込み操作がうまくいったかどうかをテストするべきです。 you`reは数も記録を更新していない - - ので、基本的にあなたが行くここ

#include <iostream> 
#include <fstream> 
using namespace std; 

struct P { 
    int n; 
}; 

int main() { 
    fstream file("afile.dat" , ios::binary|ios::out|ios::in); 
    P p; 
    p.n = 1; 
    file.write((char*)&p, sizeof(p)); 
    p.n = 2; 
    int pos = 0; 
    file.seekp(pos, ios::beg); 
    file.write((char*)&p, sizeof(p)); 
} 
0
while (!file.eof()) 
{ 
    if (record.getNumber() == number) { 
     pos=file.tellg(); 
     found = true; 
     break; 
} 

次のコードは、それを上書きし、その後(存在している必要があります)ファイルにレコードを書き込み、

ニールバターワースが正しい(私が8とタイプしている間に投稿された))は、スムースを省略したようです。

関連する問題