old2ev
@old2ev
int main(){for(;;)fork();}

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

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

"Hello world" => "Hello other world"

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

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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы