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

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

  

*"Hello world" => "Hello other world"*  

  

То есть добавить данные в файл не перезаписывая всё что идёт после "курсора"(ofstream, FILE не важно). Уже пробовал метод с промежуточным буфером, в который клал определённый объём данных файла после места редактирования и для совершения сдвига в цикле перезаписывал все идущие дальше данные через этот самый буфер. Разумеется скорость откровенно говоря хромает, начиная с 800 Мб. Может быть есть куда более оптимальный способ провернуть данную операцию. 

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

Например, может оказаться, что в этом месте можно заранее всобачить строчку на 100500 пробелов (сколько вам там нужно вставить максимум) и вы просто поверх них запишете нужное. Перезапишется один блок, остальные гонять по диску не потребуется. 

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

  

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

Системная область может располагаться в другом файле.  

  

В общем свобода полета мысли в твоих руках. 

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

  

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

  

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

  

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