C ++ fstream Стереть содержимое файла с выбранной точки - PullRequest
4 голосов
/ 24 октября 2010

Мне нужно стереть содержимое файла из выбранной точки (C ++ fstream), какую функцию мне использовать?

я написал objects, мне нужно удалить эти objects в середине файла

Ответы [ 2 ]

7 голосов
/ 24 октября 2010

C ++ не имеет стандартного механизма для усечения файла в заданной точке.Вам необходимо либо воссоздать файл (открыть с помощью ios::trunc и написать содержимое, которое вы хотите сохранить), либо использовать специфичные для ОС вызовы API (SetEndOfFile в Windows, truncate или ftruncate в Unix).

РЕДАКТИРОВАТЬ: Удаление содержимого в середине файла является чрезвычайно опасным делом.Задолго до рассмотрения любых других альтернатив я попытался бы использовать бессерверное ядро ​​базы данных, такое как SQLite, для хранения сериализованных объектов.Более того, я бы использовал SQLite по назначению, сохранив данные, необходимые этим объектам, в правильной схеме.

РЕДАКТИРОВАТЬ 2: Если для постановки задачи требуется доступ к необработанному файлу ...

Как правило, вы не удаляете данные из середины файла.Если объекты можно сериализовать на диск фиксированного размера, вы можете работать с ними как с записями, и вместо того, чтобы пытаться удалить данные, вы используете таблицу, которая индексирует записи в файле.Например, если вы напишите четыре записи по порядку, таблица будет содержать [0, 1, 2, 3].Чтобы удалить вторую запись, просто удалите ее запись из таблицы: [0, 2, 3].Существует как минимум два способа повторного использования отверстий, оставленных таблицей:

  1. При каждой вставке сканируйте первый неиспользуемый индекс и записывайте объект в соответствующем месте записи.Однако, по мере роста файла, это будет становиться все дороже.
  2. Поддерживать список свободных мест.Сохраните в качестве отдельной переменной индекс последней освобожденной записи.В месте, занимаемом этой записью, кодируют индекс свободной записи перед ней и так далее.Это поддерживает удобный связанный список бесплатных записей, требуя только места для одного дополнительного номера.Однако работать с ним сложнее и требует дополнительного дискового ввода-вывода при удалении и вставке.

Если объекты не могут быть сериализованы с фиксированной длиной, тогда этот подход становитсянамного, намного сложнее.Код управления записями переменной длины очень сложен.

Наконец, если для постановки задачи требуется поддерживать порядок записей на диске, то это глупая постановка задачи, поскольку вставка / удаление в середине файла является смехотворно дорогой;никакой разумный дизайн не потребовал бы этого.

2 голосов
/ 24 октября 2010

Общий метод состоит в том, чтобы открыть файл для доступа для чтения, открыть новый файл для доступа для записи, прочитать содержимое первого файла и записать данные, которые вы хотите сохранить, во второй файл.По завершении вы удаляете первый файл и переименовываете второй в файл первого.

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