C файловые потоки, добавляемые в начале - PullRequest
5 голосов
/ 11 января 2011

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

Ответы [ 4 ]

7 голосов
/ 11 января 2011

Нет, это невозможно. Вам придется переписать файл, чтобы вставить текст в начале.

РЕДАКТИРОВАТЬ: вы можете избежать чтения всего файла в память, если вы использовали временный файл, например:

  1. Введите значение, которое вы хотите вставить в начало файла
  2. Чтение X байтов из старого файла
  3. Запишите эти X байтов в новый файл
  4. Повторяйте 2,3, пока не закончите читать старый файл
  5. Скопируйте новый файл в старый файл.
3 голосов
/ 11 января 2011

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

Таким образом, C позволяет вам решить, как вы хотите решить эту проблему.

1 голос
/ 19 февраля 2018

Просто хотел опровергнуть некоторые из более абсолютных требований здесь:

Нет способа добавить данные в начало файла.

Неверно, если есть определенные ограничения.

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

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

Linux 4.1+ (XFS) и 4.2+ (XFS, ext4) позволяет вставлять дыры в файлы, используя fallocate, с учетом определенных ограничений смещения / длины:

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

Примеры на сайтах StackExchange можно найти в веб-поиске «Fallocate Prepend to file».

1 голос
/ 07 октября 2017

Нет способа добавить данные в начало файла.
Спрашивающий также говорит, что единственный способ решить проблему - это прочитать весь файл в память и снова записать его.

Вот другие методы.
1) Напишите заполнитель нулей известной длины.Вы можете перемотать обработчик файла и записать поверх этих данных, если вы не превышаете размер заполнителя.В упрощенном примере записывается размер неподписанного целого в начале, который представляет количество строк, которые будут следовать, но не сможет заполнить, пока не достигнет конца, и не сможет перемотать обработчик файла и переписать правильное значение.
* Примечание: некоторые версии 'C' на разных платформах настаивают на том, чтобы вы наконец поместили обработчик файла в конец файла, прежде чем закрывать обработчик файла, чтобы это работало правильно.
2) Запишите новые данные в новый файла затем с помощью файловых потоков добавить старые данные в новый файл.Удалите старый файл, а затем переименуйте новый файл в старое имя файла.Не используйте копию, это пустая трата времени.

Все методы имеют компромисс между размером диска и использованием памяти и процессора.Все зависит от требований вашего приложения.

...