Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перезапись последней строчки файла. 
:(
    Опции темы
Elfet
  Дата 6.1.2010, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Приветствую!

Расскажите пожалуйста, как можно удалить последнюю строчку из файла?

У меня есть такой код:
Код

#include "console.h"

SFConsole::SFConsole()
{
    ostream.open("console.txt", std::ios::trunc);
    i = 0;
}

SFConsole::~SFConsole()
{
    ostream.close();
}

void SFConsole::Add(string line)
{
    if(ostream.is_open())
    {
        ostream << "  " << line << endl;
        ostream.flush();
        i++;
    }
}



Мне нужно реализовать такой метод: void SFConsole::Last(string line)

Который бы при первом вызове добавлял в файл строчку, а при последующих перезаписывал последнюю строчку. 

Пожалуйста, расскажите как можно перезаписать последнюю строчку в файле? 

Заранее спасибо!


--------------------
PM MAIL WWW Skype   Вверх
InvalidProperty
Дата 6.1.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ Jabber   Вверх
Elfet
Дата 6.1.2010, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



InvalidProperty, что-то я не понял. Мне же не читать нужно из файла, а записывать в файл.  

Возможно ли как-то удалить из файла последнюю строчку? 


--------------------
PM MAIL WWW Skype   Вверх
InvalidProperty
Дата 7.1.2010, 03:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ Jabber   Вверх
comcon1
Дата 7.1.2010, 03:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Для файлов в 1 гигабайт нужно использовать, видимо, другой способ.

Для линукса - гугл в сторону ftruncate.
Для винды - в сторону аналогов. Например есть такое решение:
Цитата

Use CreateFile to open file, SetFilePointer to set current position, and SetEndOfFile to truncute file at current position.





--------------------
PM MAIL   Вверх
Elfet
Дата 7.1.2010, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



InvalidProperty, не знаю smile Может как-нибудь удалить последнюю строчку? Её то размер мы знаем?


--------------------
PM MAIL WWW Skype   Вверх
comcon1
Дата 7.1.2010, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Ну и размер обрезания ты определяешь так: встаешь СРАЗУ указателем в конец, движешься к началу до достижения \n. Положение запоминаешь - вот тебе и размер обрезания.


--------------------
PM MAIL   Вверх
Elfet
Дата 7.1.2010, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Ок, спасибо. Буду разбираться!


--------------------
PM MAIL WWW Skype   Вверх
InvalidProperty
Дата 10.1.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

Репутация: нет
Всего: 9



Цитата(comcon1 @  7.1.2010,  03:50 Найти цитируемый пост)
Ну и размер обрезания ты определяешь так: встаешь СРАЗУ указателем в конец, движешься к началу до достижения \n. Положение запоминаешь - вот тебе и размер обрезания. 

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


--------------------
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
PM MAIL ICQ Jabber   Вверх
comcon1
Дата 10.1.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Тут не суть. Можно ускорить так: встаешь в конец минус размер_буффера, читаешь буффер, ищешь \n, потом в конец минус 2*размер_буффера, читаешь буффер, и т.д.. Главное, чтобы работать только с концом файла.


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.