0

バイナリ モードでファイルの一部を置き換えるときに問題が発生します。何らかの理由で、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();

私は何か間違ったことをしていますか?

よろしくお願いします。

4

2 に答える 2

1

while() ループがどのように機能するかわかりません。一般に、eof() をテストするのではなく、読み取り操作が機能するかどうかをテストする必要があります。

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

#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) );
}   
于 2009-05-03T22:41:12.833 に答える
0
while (!file.eof())
{   
    if (record.getNumber() == number) {
       pos=file.tellg();
       found = true;
       break;
}

ここでは、番号もレコードも更新していません。つまり、基本的にすべてのファイルを調べて、「ある」場所に書き込みます (pos は初期化されていません)。

そして、ニール・バターワースは正しいです(私が8を入力している間に投稿されました))あなたはsmthを省略したようです

于 2009-05-03T22:45:47.393 に答える