LINUX.ORG.RU

[c]Вставить символ в файл

 ,


0

1

Есть файл в котором написано Helo, я хочу вставить l до o не затерев его. тоесть именно вставить. Это возможно или мне надо будет потом вписывать o?

lseek(fd, -1, 0_SETEND); write(...);



Последнее исправление: Trieforce (всего исправлений: 1)
Ответ на: комментарий от Trieforce

Проще говоря, перейди файловым курсором в позицию N на начало lo, прочитай lo, перезапиши lo в позицию N+1, запиши l в позицию N.

staseg ★★★★★
()

Возможно. Делаешь mmap() на файл, ищешь нужную позицию, сдвигаешь хвост через memmove(), вставляешь символ, munmap(). Про увеличившийся размер файла при mmap не забудь.

mv ★★★★★
()
Ответ на: комментарий от Trieforce

Тоесть мне надо сохранить все что после в буфер и переписать?

То есть «именно вставить» никак нельзя. Рассматривайте файл как непрерывный массив данных. Т.е. придётся место разрыва как-то сдвигать. Например так, как советуют два товарища выше.

velikS
()

sed -i s/o/l&/ file

тут никакого сдвига не происходит, а создаётся временный файл, который затем переименовывается в старое имя, а старый удаляется. Для коротких файлов самый оптимальный метод. Всякие vim & kate делают точно также (потому можно редактировать файлы без доступа на запись).

drBatty ★★
()
Ответ на: комментарий от staseg

Проще говоря, перейди файловым курсором в позицию N на начало lo, прочитай lo, перезапиши lo в позицию N+1, запиши l в позицию N.

ну типа того, сначала o из N, потом l из позиции N-1 и т.д. Проще и быстрее весь файл переписать. (обычно).

drBatty ★★
()
Ответ на: комментарий от drBatty

Проще и быстрее, как предложил mv, но ТСу пока ни к чему такие наверное такие изыски, поэтому я дал лобовое решение.

А временный файл имхо плохая идея, вместо перезаписи только хвоста файла, ты предлагаешь переписать его целиком.

staseg ★★★★★
()
Ответ на: комментарий от drBatty

ну типа того, сначала o из N, потом l из позиции N-1 и т.д.

Зачем побайтово? Я не предлагал дергать файловый курсор туда-сюда, записывать в буфер, и все дела.

staseg ★★★★★
()
Ответ на: комментарий от staseg

А временный файл имхо плохая идея, вместо перезаписи только хвоста файла, ты предлагаешь переписать его целиком.

да. Но почему ты решил, что это медленнее? Проблема в том, что для вставки тебе нужно переписывать файл с конца, что-бы сдвинутые данные не затёрли старые, это очень долго, по той причине, что все кеши заточены на запись/чтенние от начала к концу. Можешь проверить сам - открой любой большой файл текстовым редактором, и поищи слово с начала, а потом в обратном направлении. Ну и наконец, создатели sed и других редакторов по твоему идиоты?

Зачем побайтово?

не побайтово. Пусть по 64К, общая скорость от этого слабо изменится (даже если ты попытаешься писать побайтово, ОС тебе этого не даст сделать, она будет сама кешировать).

drBatty ★★
()
Ответ на: комментарий от drBatty

да. Но почему ты решил, что это медленнее? Проблема в том, что для вставки тебе нужно переписывать файл с конца, что-бы сдвинутые данные не затёрли старые, это очень долго, по той причине, что все кеши заточены на запись/чтенние от начала к концу. Можешь проверить сам - открой любой большой файл текстовым редактором, и поищи слово с начала, а потом в обратном направлении. Ну и наконец, создатели sed и других редакторов по твоему идиоты?

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

не побайтово. Пусть по 64К, общая скорость от этого слабо изменится (даже если ты попытаешься писать побайтово, ОС тебе этого не даст сделать, она будет сама кешировать).

Эти кэши снизят нагрузку на винт, но от (размер файла)*2 прыжков файлового указателя не избавит. Даже простое чтение вперед побайтово многократно сливает вручную буферизированному именно из-за множества вызовов чтения/сдвига.

staseg ★★★★★
()
Ответ на: комментарий от staseg

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

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

Эти кэши снизят нагрузку на винт, но от (размер файла)*2 прыжков файлового указателя не избавит. Даже простое чтение вперед побайтово многократно сливает вручную буферизированному именно из-за множества вызовов чтения/сдвига.

ну не знаю, fread(3)/fwrite(3) буферизует, причём лучше чем в ручную (откуда мне знать, куда это всё пишется? На мой диск будет писать идеально, а в продакшене диск совсем другой будет)

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.