Russian Qt Forum

Qt => Общие вопросы => Тема начата: agent007 от Май 29, 2009, 21:12



Название: Как удалить произвольную строку из текстового файла ?
Отправлено: agent007 от Май 29, 2009, 21:12
В общем вопрос встал об удалении строки под указанным номером из текстового файла, который содержит список строк произвольной длинны. Подскажите в какую сторону копать?


Название: Re: Как удалить произвольную строку из текстового файла ?
Отправлено: agent007 от Май 29, 2009, 23:53
Решение которое использую я таково
Код
C++ (Qt)
// stavim ukazatel' pozicii chteniya na nachalo faila
this->loginsFileStream->seek(0);
 
// spisok loginov
QString loginsString = this->loginsFileStream->readAll();
 
QString LoginToDelete = "Login kotoryi nado udalit'"
 
int indexLoginStrToDelete = loginsString.indexOf(LoginToDelete);
 
// esli stroka ne naidena, to my poluchim -1
if (indexLoginStrToDelete > -1 )
{
// konec stroki dlya UNIX, dlya Windows \r\n
QString endOfString = "\n";
int leightOfLogin = LoginToDelete.size()+endOfString.size();
loginsString.remove(indexLoginStrToDelete, leightOfLogin);
 
// sozdaem potok dlya zapisi pol'zovatelei v fail
QTextStream loginOUT(this->loginsFile);
// resaizim fail
if (loginsFile->resize(0))
{
// esli fail sresaizili, to pishem novyi variant faila
loginOUT << loginsString;
}
}
 

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


Название: Re: Как удалить произвольную строку из текстового файла ?
Отправлено: Valeriy от Май 30, 2009, 00:51
Оптимальный вариант - fseek к логину и перезапись его пробелами. :) Конечно, если программа при чтении этого файла может обрабатывать пустые строки. Ну и конечно, если добавление и удаление пользователей будут происходить постоянно, то это плохой вариант - будет много пустых строк.


Название: Re: Как удалить произвольную строку из текстового файла ?
Отправлено: agent007 от Май 30, 2009, 10:59
Fseek это ведь из Windows, под UNIX оно скомпелируется и будет работать?


Название: Re: Как удалить произвольную строку из текстового файла ?
Отправлено: spectre71 от Май 30, 2009, 11:23
В общем случае открыть файл на чтение-запись. Читать файл от начала и разбирать пока не найдешь начало и конец нужной строки. Далее переписывать хвост. Проще работать с 2 файлами - из одного читаем, в другой пишем -  первый удаляем второй переименовываем.

Если требуется оптимизация - описывай подробно задачу!


Название: Re: Как удалить произвольную строку из текстового файла ?
Отправлено: agent007 от Май 30, 2009, 13:46
Если требуется оптимизация - описывай подробно задачу!
- а я её и описал, но если надо по-пунктам, то вот:
1. имеется файл, который содержит к примеру 200'000 строк
2. строки имеют различную длинну
3. конец строки "\n", к примеру
Сам вопрос - как из такого файла удалить строку под номером 128'174 ?
Если использовать два файла, то на файлах в 50 мегабайт нужно ждать долго.
Код тоже желательно приложить, а то на словах всё легко.


Название: Re: Как удалить произвольную строку из текстового файла ?
Отправлено: Valeriy от Май 30, 2009, 15:12
1. Делаем все строки для удобства длинной 30 символов.
2. Читаем по 30 символов из файла и ищем строчку с логином.
3. Когда найдём, при помощи seek откатываемся на 30 символов назад и пишем 30 пробелов.
4. Делаем flush.

При фиксированной длине строки и известном номере строки можно сразу сделать seek. Про fseek я заговорил, т.к. привык к Си, это из стандартной библиотеке и есть везде, где есть компилятор Си. :)

А вообще, решая такие задачи люди придумали базы данных. :)) Можно, например, воспользоваться SQLite, благо она маленькая и хорошо работает с Qt.


Название: Re: Как удалить произвольную строку из текстового файла ?
Отправлено: spectre71 от Май 30, 2009, 18:16
Если требуется оптимизация - описывай подробно задачу!
- а я её и описал, но если надо по-пунктам, то вот:
1. имеется файл, который содержит к примеру 200'000 строк
2. строки имеют различную длинну
3. конец строки "\n", к примеру
Сам вопрос - как из такого файла удалить строку под номером 128'174 ?
Если использовать два файла, то на файлах в 50 мегабайт нужно ждать долго.
Код тоже желательно приложить, а то на словах всё легко.

Если надо удалить строку физически, то других вариантов как перезаписать хвост файла или весь файл - НЕТ!
Но могут быть другие подходы для решения проблемы.

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

Может тебе действительно проще всасать данные из файла в SQL базу и работать с ними.
В твоем кратком описании интересны только первые два пункта.