Обновление записей в двоичном файле с C ++ - PullRequest
1 голос
/ 18 августа 2011

Я столкнулся с проблемой, и моих текущих знаний C ++ недостаточно для ее решения. Я искал ответ в книгах Страуструпа, но полное понимание того, что я делаю для меня не сейчас.

Так что суть.

Я пишу в файл:

int i = 1;
int j = 2;
ofstream ofs("file", ios::binary);
ofs.write(as_bytes(i), sizeof(int));
ofs.write(as_bytes(j), sizeof(int));

После этого мне нужно обновить второе значение:

int j = 10;
ofstream ofs("file", ios::binary);
ofs.seekp(4, ios::beg);
ofs.write(as_bytes(j), sizeof(int));

И когда я пытаюсь прочитать файл:

int i = 0;
int j = 0;
ifstream ifs("file", ios::binary);
ifs.read(as_bytes(i), sizeof(int));
ifs.read(as_bytes(j), sizeof(int));
cout << i << ' ' << j << endl;

Оказывается, я теряю первое значение. Что я делаю неправильно? Почему он исчез?

1 Ответ

3 голосов
/ 18 августа 2011

По умолчанию файл будет обрезан (ios:trunc, т. Е. Содержимое будет потеряно при открытии файла для записи).

Для второй операции записи явно добавьте флаги ios:in AND ios:outнесмотря на то, что ты пишешь только.По сути, я бы использовал следующее:

ofstream ofs("file", ios::binary | ios::in | ios::out | ios::ate);

Это должно открыть файл с указателем потока / файла в конце файла (хотя ios::ate может быть необязательным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...