Russian Qt Forum

Qt => Общие вопросы => Тема начата: alexey.pertcev от Октябрь 20, 2011, 03:17



Название: Редактирования строки в файле QTextStream
Отправлено: alexey.pertcev от Октябрь 20, 2011, 03:17
Господа,
прошу не пинать сильно, но нигде пока не нашел ответа

Задача поправить строку в текстовом файле, то есть
взять строку из файла, поправить её и засунуть в обратно на тоже место,
Взять и поправить я могу, но при вставке поправленная строка записывается не туда куда нужно..
можно ли это сделать с помощью QTextStream?(думаю что можно) если да, то какие методы нуно при этом использовать?

Моё поделие:
    QFile file(name_file);
    if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
        return false;

    QTextStream in(&file);
    while (!in.atEnd()) {
       QString line = in.readLine();
        if (line.contains(rx)){  //проверяю нужно ли править строку
            in << line.append("   <-- changed string\n");  //хочу записать измененную строку в то же место откуда взял
        }
    }


Название: Re: Редактирования строки в файле QTextStream
Отправлено: Bepec от Октябрь 20, 2011, 07:08
И походу у тебя проблема в том, что он пишет на строчку ниже?

Или куда он у тебя что пишет :)

"Не туда куда нужно" - я такого места незнаю :)

Приведи простейший пример аля

Было:
Код:
а
б
в // сюда нужно перезаписать

Стало:
Код:
а 
в //перезаписало
в

Сразу станет понятней.


Название: Re: Редактирования строки в файле QTextStream
Отправлено: kambala от Октябрь 20, 2011, 09:21
И походу у тебя проблема в том, что он пишет на строчку ниже?
да, потому что readLine() сразу перемещает курсор к следующей строке

должно подойти такое:
Код
C++ (Qt)
QString line = in.readLine();
if (line.contains(rx)){  //проверяю нужно ли править строку
   file.seek(file.pos() - line.length() - 1); // ещё единичка для перевода строки
   in << line.append("   <-- changed string\n");  //хочу записать измененную строку в то же место откуда взял
}


Название: Re: Редактирования строки в файле QTextStream
Отправлено: alexey.pertcev от Октябрь 20, 2011, 17:19
Уточнение проблемы:
Измененные программой строки не перезаписываются в то же место, а добавляются в конец файла
то есть сейчас результат работы такой:
до
Код:
1строка
2строка(нужно изменить)
3сторка
4строка(нужно изменить)
после
Код:
1строка
2строка(нужно изменить)
3сторка
4строка(нужно изменить)
2строка(измененная)
4строка(измененная)

Добавление
 file.seek(file.pos() - line.length() - 1);
никак не повлияло на результат, мне кажется что дело в операторе <<, т.к. он добавляет сразу в конец файла.
Возможно нужно использовать что-то вместо него?


Название: Re: Редактирования строки в файле QTextStream
Отправлено: kambala от Октябрь 20, 2011, 17:30
можно ещё попробовать
Код
C++ (Qt)
in.device()->seek(file.pos() - line.length() - 1);
а если не поможет, тогда наверное лучше работать без QTextStream - напрямую с QFile методами readLine(), seek(), write()


Название: Re: Редактирования строки в файле QTextStream
Отправлено: alexey.pertcev от Октябрь 20, 2011, 20:21
Реализовал вот так:
Код:
    
while (!file.atEnd()) {
        line = file.readLine();
        string = line;
        if (string.contains(rx)){
            std::cout << "  " << qPrintable(string);
            file.seek(file.pos() - line.length());

            line.clear();
            line.insert(0,string.toLower());
            file.write(line);
        }
    }

Спасибо за помошь)

Исправил, после file.write "курсор" сам устанавливается в начало следующей строки