| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Перезапись последней строчки файла. |
| Автор: Elfet 6.1.2010, 14:01 | ||
| Приветствую! Расскажите пожалуйста, как можно удалить последнюю строчку из файла? У меня есть такой код:
Мне нужно реализовать такой метод: void SFConsole::Last(string line) Который бы при первом вызове добавлял в файл строчку, а при последующих перезаписывал последнюю строчку. Пожалуйста, расскажите как можно перезаписать последнюю строчку в файле? Заранее спасибо! |
| Автор: InvalidProperty 6.1.2010, 15:19 |
| как один из вариантов: выбираем размер буфера, к примеру, 4096. Если размер файла > размера буфера => читаем буфер. Ежели среди него strrchr(buf, '\n') найдется, то с этой позиции записываем новую строку: обрезаем файл с точки нахождения перевода каретки и пишем в файл новую строку. Ежели в буфере перевода каретки найдено не было, запоминаем то, что мы уже прочитали из файла буфер такого объема и читаем следующий буфер ближе к началу. Дальше операция повторяется. Ежели же размер файла меньше буфера, читаем в буфер весь файл, а далее все так же |
| Автор: Elfet 6.1.2010, 21:30 |
| InvalidProperty, что-то я не понял. Мне же не читать нужно из файла, а записывать в файл. Возможно ли как-то удалить из файла последнюю строчку? |
| Автор: InvalidProperty 7.1.2010, 03:33 |
| а как п-твоему ты узнаешь, где кончается строка в файле? |
| Автор: comcon1 7.1.2010, 03:48 | ||
| Для файлов в 1 гигабайт нужно использовать, видимо, другой способ. Для линукса - гугл в сторону ftruncate. Для винды - в сторону аналогов. Например есть такое решение:
|
| Автор: Elfet 7.1.2010, 03:49 |
| InvalidProperty, не знаю |
| Автор: comcon1 7.1.2010, 03:50 |
| Ну и размер обрезания ты определяешь так: встаешь СРАЗУ указателем в конец, движешься к началу до достижения \n. Положение запоминаешь - вот тебе и размер обрезания. |
| Автор: Elfet 7.1.2010, 04:05 |
| Ок, спасибо. Буду разбираться! |
| Автор: comcon1 10.1.2010, 17:35 |
| Тут не суть. Можно ускорить так: встаешь в конец минус размер_буффера, читаешь буффер, ищешь \n, потом в конец минус 2*размер_буффера, читаешь буффер, и т.д.. Главное, чтобы работать только с концом файла. |