Russian Qt Forum

Qt => Вопросы новичков => Тема начата: QPeter от Март 07, 2014, 22:23



Название: Построчное чтение из файла
Отправлено: QPeter от Март 07, 2014, 22:23
Хочу чтоб каждую секунду из файла считывалась новая строка из файла и содержимое строки присваивалось переменной- которая является координатой на оси у. Но она почему то сохраняется в значении полученном при первой итерации. Что не так?(



Код:
private:
    Ui::Widget *ui;
    int x,y;
    QString buffer;
    qint64 line_number;

Код:
...
    QTimer *point_update=new QTimer;
    connect(point_update, SIGNAL(timeout()),this,SLOT(pointsmath()));
    point_update->start(1000);
...

Код:
void Widget:: pointsmath(){
    //-------------------------------------------------------------------------------------------------
    QFile mFile("C:/Test/test.txt");
    if(!mFile.open(QFile::ReadOnly|QFile::Text))
    {
        QMessageBox::information(this, "Error", "Путь не правильный");
        return;
    }
    QTextStream stream(&mFile);

    qDebug()<<"line_number="<<line_number;
   
    y=0;
    buffer.clear();

    buffer=stream.readLine(line_number);// вся проблема в этой строке...наверное
    y=buffer.toInt();
    points << QPointF( x, y); // заполнение
    x++;
    y++;
    line_number++;
    qDebug()<<"buffer="<<buffer;
    qDebug()<<x<<"/"<<y;
   
    mFile.flush();
    mFile.close();
    //-------------------------------------------------------------------------------------------------------
    curve->setSamples( points );
    curve->attach( ui->wgtBoss );
}

Результаты qDebug()
Код:
...
line_number= 1
buffer= "1"
x= 1 /y= 1
line_number= 2
buffer= "1"
x= 2 /y= 1
line_number= 3
buffer= "1"
x= 3 /y= 1
line_number= 4
buffer= "1"
x= 4 /y= 1
...

Вообще есть подозрение что не работает из за того что постоянно QTextStream stream(&mFile); объявляется при каждой итерации...


Название: Re: Построчное чтение из файла
Отправлено: kambala от Март 07, 2014, 22:39
каждый раз ты читаешь первую строку потому что при открытии файла указатель в файле стоит на начале.

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


Название: Re: Построчное чтение из файла
Отправлено: QPeter от Март 07, 2014, 22:43
Так я же line_number задаю строку которая мне нужна, разве не так?


Название: Re: Построчное чтение из файла
Отправлено: QPeter от Март 07, 2014, 22:46
По условию задания файл нельзя открыть и всё сразу прочесть, тк в файл постоянно  будут добавляться новые значения.


Название: Re: Построчное чтение из файла
Отправлено: Alex Custov от Март 07, 2014, 23:00
Так я же line_number задаю строку которая мне нужна, разве не так?

ты документацию читал? Ответ - нет, не читал. readLine(N) читает из потока данные, но не более чем N символов. Это значит, что чтобы прочитать строку под номером 10 нужно сперва прочитать 9 предыдущих строк.


Название: Re: Построчное чтение из файла
Отправлено: QPeter от Март 07, 2014, 23:07
Читал, но этот момент не доглядел, ::)

Ну а как тогда реализовать такую штуку? Есть какой нибудь оператор который будет читать именно ту строку которая мне нужна?


Название: Re: Построчное чтение из файла
Отправлено: Alex Custov от Март 07, 2014, 23:17
Ну а как тогда реализовать такую штуку? Есть какой нибудь оператор который будет читать именно ту строку которая мне нужна?

Такого оператора, а вернее метода, нет. Сперва нужно считывать все строки до нужной. Это свойство последовательного доступа к диску. Не знаю есть ли диски со случайным доступом, в любом случае в API Qt такой способ чтения файла не поддерживается.


Название: Re: Построчное чтение из файла
Отправлено: kambala от Март 07, 2014, 23:22
По условию задания файл нельзя открыть и всё сразу прочесть, тк в файл постоянно  будут добавляться новые значения.
значит каждый раз считаешь сколько строк прочитано, потом пропускаешь столько строк при чтении и сохраняешь только новые


Название: Re: Построчное чтение из файла
Отправлено: QPeter от Март 07, 2014, 23:22
А можно считать файл, записать его в динамический массив например, а потом вытащить последнее значении массива и обнулить его перед проведением следующей итерации?


Название: Re: Построчное чтение из файла
Отправлено: QPeter от Март 07, 2014, 23:36
Цитировать
значит каждый раз считаешь сколько строк прочитано, потом пропускаешь столько строк при чтении и сохраняешь только новые

Но этот способ мне нравится больше, спасибо)


Название: Re: Построчное чтение из файла
Отправлено: Johnik от Март 08, 2014, 02:35
Я думаю считать строки не придется. вот пример:

testfileread.h
Код
C++ (Qt)
#include <QtCore>
 
class TestFileRead : public QObject
{
Q_OBJECT
public:
TestFileRead(QObject* parent = NULL);
~TestFileRead();
private slots:
void read();
private:
QFileSystemWatcher w;
QFile* f;
QTextStream s;
};

testfileread.cpp
Код
C++ (Qt)
#include "testfileread.h"
#include <QDebug>
TestFileRead::TestFileRead(QObject* parent /* = NULL */)
: QObject(parent)
{
f = new QFile("1.txt", this);
f->open(QFile::ReadOnly);
s.setDevice(f);
w.addPath("1.txt");
connect(&w, &QFileSystemWatcher::fileChanged, this, &TestFileRead::read);
}
TestFileRead::~TestFileRead() { }
void TestFileRead::read()
{
while (!s.atEnd()) {
qDebug(qPrintable(s.readLine()));
}
}
но все ж есть некоторые маленькие проблемы в подобной реализации... оставляю для самостоятельного исправления


Название: Re: Построчное чтение из файла
Отправлено: Igors от Март 08, 2014, 14:07
значит каждый раз считаешь сколько строк прочитано, потом пропускаешь столько строк при чтении и сохраняешь только новые
А не проще ли хранить размер прочитанного, а при след чтении делать seek?

Код
C++ (Qt)
void TestFileRead::read()
{
while (!s.atEnd()) {
qDebug(qPrintable(s.readLine()));
}
}
А откуда уверенность что "полная" строка была добавлена? Это может быть напр всего лишь буква (в той же строке)


Название: Re: Построчное чтение из файла
Отправлено: kambala от Март 08, 2014, 16:31
значит каждый раз считаешь сколько строк прочитано, потом пропускаешь столько строк при чтении и сохраняешь только новые
А не проще ли хранить размер прочитанного, а при след чтении делать seek?
действительно, так проще


Название: Re: Построчное чтение из файла
Отправлено: Johnik от Март 08, 2014, 19:30
А откуда уверенность что "полная" строка была добавлена? Это может быть напр всего лишь буква (в той же строке)
ответ тут:
но все ж есть некоторые маленькие проблемы в подобной реализации... оставляю для самостоятельного исправления


Название: Re: Построчное чтение из файла
Отправлено: Igors от Март 09, 2014, 09:45
но все ж есть некоторые маленькие проблемы в подобной реализации...
Ну чего же "маленькие" если их решение заметно больше Вашего?  :)
оставляю для самостоятельного исправления
А сам учитель может исправить или так, только задания дает?  :)


Название: Re: Построчное чтение из файла
Отправлено: Johnik от Март 09, 2014, 12:17
А сам учитель может исправить или так, только задания дает?  :)
может, а на форуме принято выдавать полностью рабочий и отлаженный код спрашивающему, или давать направление для дальнейшего поиска?


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


Название: Re: Построчное чтение из файла
Отправлено: Igors от Март 10, 2014, 08:39
Вообще при данных условиях, я не стал бы использовать для чтения строк класс QTextStream, действительно сложно будет избежать возможных разбиений одной строки.
При каждом изменении файла следует читать в какой-то буфер. А уже буфер проверять на предмет наличия символов завершения строки (или других необходимых), и при его наличии, осуществлять разбор буфера, получать координаты и испускать ("эмитить") сигнал с координатами.
Может так: запоминаем позицию файла (напр в члене класса). При каждом обновлении читаем файл в буфер "от позиции до конца" и обновляем позицию. Считываем из буфера "полные" строки и отдаем юзверю, затем очищаем буфер но сохраняем в нем последнюю (неполную) строку. 

Все-таки здесь одна пакость: последняя строка может и не заканчиваться EOL


Название: Re: Построчное чтение из файла
Отправлено: Johnik от Март 10, 2014, 08:43
Позицию запоминать не надо, этим занимается QFile, проверено, в остальном: да


Название: Re: Построчное чтение из файла
Отправлено: Igors от Март 10, 2014, 08:56
Позицию запоминать не надо, этим занимается QFile, проверено,
Это если хотим держать его открытым


Название: Re: Построчное чтение из файла
Отправлено: Johnik от Март 10, 2014, 09:07
А зачем каждый раз открывать, закрывать? один раз открыть для чтения, тем более писать в него можно будет в этот момент без проблем.