Вроде бы задачка тривиальная, но я с удивлением обнаружил, что у меня не хватает мозгов ее решить. Итак, как записать данные в середину файла, а нижележащие данные сдвинуть вниз? Разумеется корявым образом я это сделать могу, но не хочется. А как правильно - хз. И если возможно, то без мэппингов, так как должно быть покроссплатформеннее. Спасибо.
Читай файл с конца по блокам и записывай по адресу начало_текущего_блока+размер_вставляемых_данных, когда дойдёшь до нужной позиции просто запиши свои данные и всё.
Exp10der )) Честно прочитал раз 10. Ни черта не понял. Но потом дошло. Спасибо. Только пока не догнал как читать с конца и в каком режиме в этом случае открывать файл? fopen(..., "r+")? det Да не. обычный файл - бинарный или текстовый. скорее всего текстовый.
как бы этот код не верен. Надо записать данные, предварительно сдвинув данные, лежащие после. В чем трудность? Читаем из файлы конечный блок, двигаем файловый указатель на "куда записать + размер записываемого". и записываем конечный блок. После этого возвращаемся на "куда записать", и пишем то что нужно.
device Эммм... ну и че этто будет? разве данные в середине не потрутся? (а "середина" это я условно сказал)) имеется в виду не начало и не конец.) а вот ф-цию fstat я не знал раньше. сэнкс.
После lseek() нужно вызвать SetEndOfFile() и место реально выделится. P.S. Не знаю, если ли аналоги в C'шной бибилиотеке, т.к. никогда ей не пользовался.
Xerx Проблему в этом случае видимо решит запись в конец файла недостающих байтов (например, запись байта 0 в нужном количестве).
SetEndOfFile выделяет доп. место от конца файла и до текущей позиций файлового указателя. Причем заполняет все нулями. p.s. Так я и не в свое время разобрался, как можно просто изменить размер файла без инициализации.
Я тоже это читал. А в чем проблема-то? Или ты про "but this does not change the size of the file". Так у меня в мане такого нет. Причем в разных *nix дистрибах. Смотрел на Debian и на солярке десятой.
а что стоит переписать начиная с конца файла сперва блок длиной с вставляемый двигаясь вперед. Затем начиная с бывшего конца файла оставшееся двигаясь назад. Затем уже в позицию вставки записать то, что врезать надо?
в общем виде задача не имеет вменяемого решения, т.к. все зависит от длины файла, fs и носителя, а так же свободного места на носителе, где размещен файл, объема памяти и наличия дополнительных носителей. вменяемое решение предполагает, что мы получим минимально фрагментированный файл, в процессе копирования головка совершит минимальное кол-во перемещений, ну и само копирование будет предельно быстрым. плюс нужно еще рассмотреть требования отказоустойчивости. что произойдет, если операция прервется до завершения? в каком состоянии окажется файл? копирование через временный файл очень надежно, хотя несет свои издержки. с другой стороны, при работе с RW дисками нужно выбирать размер блока кратный размеру кластера, иначе мы получим большие тормоза, так же нужно позаботится о выравнивании позиций чтения/записи. да много тонкостей. более или менее универсальное решение представляет собой совокупность функций, выбираемых в зависимости от конкретных обстоятельств, например, того же размера файла, например.
здесь ещё многое зависит от структуры самого файла - с деревом общаться по дописыванию и вставки узлов довольно легко Green_DiCk так что подумай насчёт подборки удобного формата.