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没有被初始化)

Neil Butterworth 是对的(在我输入 8 时发布))似乎你省略了 smth

于 2009-05-03T22:45:47.393 回答