Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Перезапись последней строчки файла.


Автор: Elfet 6.1.2010, 14:01
Приветствую!

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

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

#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)

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

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

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

Автор: 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.
Для винды - в сторону аналогов. Например есть такое решение:
Цитата

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



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

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

Автор: Elfet 7.1.2010, 04:05
Ок, спасибо. Буду разбираться!

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)