2011-01-10 1 views
3

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

+5

«Добавление в начале» обычно называется «prepending» :) – dreamlax

ответ

6

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

EDIT: Вы можете не читать весь файл в память, если используется временный ИЭ файла:

  1. Написать значение, которое вы хотите вставить в начало файла
  2. Read X байт из старого файл
  3. Написать эти X байт в новый файл
  4. Repeat 2,3, пока вы не закончите читать старый файл
  5. Скопируйте новый файл в старый файл.
3

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

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

+1

+1 для «нет пустых доступных байтов перед началом файла». – Mir

0

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

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

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

0

Просто хотел, чтобы противостоять некоторым из наиболее абсолютных требований здесь:

Там нет никакого способа, чтобы добавить данные в начало файла.

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

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^