![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Приветствую!
Расскажите пожалуйста, как можно удалить последнюю строчку из файла? У меня есть такой код:
Мне нужно реализовать такой метод: void SFConsole::Last(string line) Который бы при первом вызове добавлял в файл строчку, а при последующих перезаписывал последнюю строчку. Пожалуйста, расскажите как можно перезаписать последнюю строчку в файле? Заранее спасибо! |
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
как один из вариантов:
выбираем размер буфера, к примеру, 4096. Если размер файла > размера буфера => читаем буфер. Ежели среди него strrchr(buf, '\n') найдется, то с этой позиции записываем новую строку: обрезаем файл с точки нахождения перевода каретки и пишем в файл новую строку. Ежели в буфере перевода каретки найдено не было, запоминаем то, что мы уже прочитали из файла буфер такого объема и читаем следующий буфер ближе к началу. Дальше операция повторяется. Ежели же размер файла меньше буфера, читаем в буфер весь файл, а далее все так же Это сообщение отредактировал(а) InvalidProperty - 6.1.2010, 15:21 -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
InvalidProperty, что-то я не понял. Мне же не читать нужно из файла, а записывать в файл.
Возможно ли как-то удалить из файла последнюю строчку? |
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
а как п-твоему ты узнаешь, где кончается строка в файле?
-------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Для файлов в 1 гигабайт нужно использовать, видимо, другой способ.
Для линукса - гугл в сторону ftruncate. Для винды - в сторону аналогов. Например есть такое решение:
|
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
InvalidProperty, не знаю
|
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Ну и размер обрезания ты определяешь так: встаешь СРАЗУ указателем в конец, движешься к началу до достижения \n. Положение запоминаешь - вот тебе и размер обрезания.
|
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Ок, спасибо. Буду разбираться!
|
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
этот метод хуже того, который предложил я, ибо чтение побайтовое со здвигом указателя при каждом чтении будет очень непродуктивным. -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Тут не суть. Можно ускорить так: встаешь в конец минус размер_буффера, читаешь буффер, ищешь \n, потом в конец минус 2*размер_буффера, читаешь буффер, и т.д.. Главное, чтобы работать только с концом файла.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |