fstream заменяет часть файла - PullRequest
1 голос
/ 27 апреля 2009

Когда я делаю

fstream someFile("something.dat", ios::binary|ios::out);
someFile.seekp(someLocation, ios::beg);
someFile.write(someData, 100);

Кажется, он заменяет весь файл этими 100 байтами вместо замены только соответствующих 100 байтов, как если бы я указал ios :: trunc Существует ли переносимый способ не обрезать файл?

Редактировать: добавление ios :: in, кажется, помогает, почему это требуется и это стандартное поведение?

Редактировать # 2: Я не пытаюсь добавить существующий файл. Мне нужно заменить 100 байтов, оставляя остальные без изменений.

Ответы [ 4 ]

2 голосов
/ 27 апреля 2009

Поскольку файл уже существует, откройте его в режиме «чтение + запись», а затем выполните поиск. Я думаю, что это будет работать.

fstream someFile("something.dat", ios::binary|ios::out|ios::in);
someFile.seekp(someLocation, ios::beg);
someFile.write(someData, 100);
2 голосов
/ 27 апреля 2009

Вам нужен флаг добавления, ios :: app, если вы хотите написать в конце файла.

Чтобы сделать это где-нибудь произвольно в середине файла, вам нужно искать в нужном месте. Вы МОЖЕТЕ сделать это, открыв файл для входов и выходов, но на вашем месте я бы создал временный файл, скопировал бы ввод для отметки, записал ваши новые данные, скопировал остальные в EOF, закрыл файлы и заменил предыдущие версия с временным файлом. Это называется «Обновлением мастер-файла».

2 голосов
/ 27 апреля 2009

AFAIR ios :: out только указывает, что файл предназначен для вывода, а ios: binary только указывает, что файлы являются двоичными. Поведение по умолчанию для потока - создать новый файл и перезаписать старый файл. Если вы хотите изменить существующий файл, вы должны открыть файл с флагом ios :: app.

Банкомат Я не могу проверить свои рекомендации, поэтому обязательно проверьте еще раз, но я считаю, что это точно.

1 голос
/ 27 апреля 2009

Ios: в маске указывает указателю файла положение в начале файла, чтобы он мог начать чтение с самого начала. Но вы можете использовать fseek, чтобы установить указатель файла в начале файла.

...