Как добавить одну строку перед последней строкой в ​​C - PullRequest
0 голосов
/ 17 декабря 2009

Привет, я работаю в C на платформе Unix. Скажите, пожалуйста, как добавить одну строку перед последней строкой в ​​C. Я использовал fopen в режиме добавления, но не могу добавить одну строку перед последней.

Я просто хочу записать вторую последнюю строку в файле.

Ответы [ 5 ]

5 голосов
/ 17 декабря 2009

Вам не нужно перезаписывать весь файл. Вам просто нужно:

  • откройте ваш файл в режиме "rw",
  • прочитайте ваш файл, чтобы найти последнюю строку: сохраните его позицию (ftell / ftello) в файле и его содержимое
  • вернуться к началу последней строки (fseek / fseeko)
  • напишите что хотите до последней строки
  • напишите последнюю строку.
  • закройте файл.
2 голосов
/ 17 декабря 2009

Нет никакого способа сделать это непосредственно в стандартном C, в основном потому, что немногие файловые системы поддерживают эту операцию. Самый простой способ обойти это - прочитать файл в структуру в памяти (где она, вероятно, в любом случае есть), вставить строку в память, а затем снова записать всю структуру, переписав исходный файл.

1 голос
/ 17 декабря 2009

Используйте fseek, чтобы перейти к концу файла, читайте в обратном направлении до появления новой строки. Затем вставьте свою строку. Возможно, вы захотите сохранить «последнюю строку», которую вы читаете, посчитав, сколько символов вы читаете в обратном направлении, а затем поместите ее в правильно распределенный буфер.

1 голос
/ 17 декабря 2009

Вы можете найти место, где заканчивается последняя строка, прочитать последнюю строку в памяти, найти место назад, написать новую строку, а затем последнюю строку.

Чтобы найти место: ищите до конца, минус размер буфера. Читай буфер, ищи новая линия. Если не найден, ищите назад два размера буфера и попробуйте снова.

Вам нужно будет использовать режим r + для fopen.

О, и вам нужно быть осторожным с текстовым и двоичным режимами. Вам необходимо использовать двоичный режим, поскольку в текстовом режиме вы не можете вычислить позиции прыжка, вы можете переходить только в те места, которые вы получили из ftell. Вы можете обойти это, прочитав весь файл и вызвав ftell в начале каждой строки. Для больших файлов это будет медленно.

1 голос
/ 17 декабря 2009

Добавить только добавляет в конец, а не в середине.

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

...