@old2ev
C/C++ программист-энтузиаст

Как в C++ или Си вставить данные в файл без загрузки всего файла в буффер?

Здравствуйте. Столкнулся с проблемой обработки очень больших бинарных файлов. Крайне желательно их полностью не размещать в виртуальной памяти компьютера. Для поиска по ним используется заголовок с размерами расположенный в начале файла. Если не углубляться в вопрос то требуется нересурсоёмкий способ сделать так:

"Hello world" => "Hello other world"

То есть добавить данные в файл не перезаписывая всё что идёт после "курсора"(ofstream, FILE не важно). Уже пробовал метод с промежуточным буфером, в который клал определённый объём данных файла после места редактирования и для совершения сдвига в цикле перезаписывал все идущие дальше данные через этот самый буфер. Разумеется скорость откровенно говоря хромает, начиная с 800 Мб. Может быть есть куда более оптимальный способ провернуть данную операцию.
  • Вопрос задан
  • 308 просмотров
Решения вопроса 2
Adamos
@Adamos
Только один: найти решение, не требующее записать произвольный текст в начало огромного бинарного файла, сдвигая все прочие данные.
Например, может оказаться, что в этом месте можно заранее всобачить строчку на 100500 пробелов (сколько вам там нужно вставить максимум) и вы просто поверх них запишете нужное. Перезапишется один блок, остальные гонять по диску не потребуется.
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
Как это делают некоторые программы, например базы данных - создают свою виртуальную систему для хранения данных, внутри которой организовывают свою структуру хранения данных.

Создаешь, например, большой файл для данных, делишь его на блоки, добавляешь системную область, в которой упорядочиваешь данные, указывая какие блоки и в каком порядке хранят данные. Таким образом можно всегда добавить блок в произвольное место файла, хотя физически он будет добавлен в конце, или в незанятый "блок".
Системная область может располагаться в другом файле.

В общем свобода полета мысли в твоих руках.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg
Баянист. Тамада. Услуги.
Нет такого способа. Невозможно без изобретения своей файловой системы врезать куда-то в середину файла какое-то количество байт.

Исключением будет разве что врезание в файл количества байт, кратного размеру кластера ФС, начинающегося со смещения, также кратного этому размеру, путем ручного перетряхивания $MFT или аналога

Но это опасно и абсолютно технически безграмотно.

А мораль проста - храните данные в СУБД, они специально так устроены, чтобы этот вопрос решался нересурсоемким способом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Eltex Новосибирск
от 80 000 ₽
Flipper Devices Inc. Москва
от 100 000 ₽
4Taps Mobile Тольятти
от 120 000 до 190 000 ₽
04 мар. 2021, в 22:39
2500 руб./за проект
04 мар. 2021, в 22:15
10000 руб./за проект
04 мар. 2021, в 21:50
20000 руб./за проект