Russian Qt Forum
Ноябрь 25, 2024, 23:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как удалить произвольную строку из текстового файла ?  (Прочитано 9886 раз)
agent007
Гость
« : Май 29, 2009, 21:12 »

В общем вопрос встал об удалении строки под указанным номером из текстового файла, который содержит список строк произвольной длинны. Подскажите в какую сторону копать?
Записан
agent007
Гость
« Ответ #1 : Май 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;
}
}
 

этот код очень тормозной на больших файлах, как мне кажется, подскажите пожалуйста код,  чтобы работал быстро на больших файлах. (для моей программки такой код работает нормально, но всегда хочется большего Подмигивающий )
Записан
Valeriy
Гость
« Ответ #2 : Май 30, 2009, 00:51 »

Оптимальный вариант - fseek к логину и перезапись его пробелами. Улыбающийся Конечно, если программа при чтении этого файла может обрабатывать пустые строки. Ну и конечно, если добавление и удаление пользователей будут происходить постоянно, то это плохой вариант - будет много пустых строк.
Записан
agent007
Гость
« Ответ #3 : Май 30, 2009, 10:59 »

Fseek это ведь из Windows, под UNIX оно скомпелируется и будет работать?
Записан
spectre71
Гость
« Ответ #4 : Май 30, 2009, 11:23 »

В общем случае открыть файл на чтение-запись. Читать файл от начала и разбирать пока не найдешь начало и конец нужной строки. Далее переписывать хвост. Проще работать с 2 файлами - из одного читаем, в другой пишем -  первый удаляем второй переименовываем.

Если требуется оптимизация - описывай подробно задачу!
Записан
agent007
Гость
« Ответ #5 : Май 30, 2009, 13:46 »

Если требуется оптимизация - описывай подробно задачу!
- а я её и описал, но если надо по-пунктам, то вот:
1. имеется файл, который содержит к примеру 200'000 строк
2. строки имеют различную длинну
3. конец строки "\n", к примеру
Сам вопрос - как из такого файла удалить строку под номером 128'174 ?
Если использовать два файла, то на файлах в 50 мегабайт нужно ждать долго.
Код тоже желательно приложить, а то на словах всё легко.
Записан
Valeriy
Гость
« Ответ #6 : Май 30, 2009, 15:12 »

1. Делаем все строки для удобства длинной 30 символов.
2. Читаем по 30 символов из файла и ищем строчку с логином.
3. Когда найдём, при помощи seek откатываемся на 30 символов назад и пишем 30 пробелов.
4. Делаем flush.

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

А вообще, решая такие задачи люди придумали базы данных. Улыбающийся) Можно, например, воспользоваться SQLite, благо она маленькая и хорошо работает с Qt.
Записан
spectre71
Гость
« Ответ #7 : Май 30, 2009, 18:16 »

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

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

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

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

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.191 секунд. Запросов: 21.