Проблема с seekp (), чтобы заменить часть файла в двоичном режиме - PullRequest
0 голосов
/ 04 мая 2009

У меня возникли проблемы с заменой части файла в двоичном режиме. По какой-то причине моя строка 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();

Я что-то не так делаю?

Заранее большое спасибо.

Ответы [ 2 ]

1 голос
/ 04 мая 2009

Я не вижу, как может работать ваш цикл 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) );
}   
0 голосов
/ 04 мая 2009
while (!file.eof())
{   
    if (record.getNumber() == number) {
       pos=file.tellg();
       found = true;
       break;
}

здесь - вы не обновляете ни номер, ни запись - поэтому в основном вы просматриваете весь файл и записываете в «некое» место (pos не инициализируется)

И Нил Баттерворт прав (написал, пока я набрал 8)) похоже, что вы что-то пропустили

...