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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Построчное чтение из файла  (Прочитано 14572 раз)
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); объявляется при каждой итерации...
« Последнее редактирование: Март 07, 2014, 22:30 от QPeter » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Март 07, 2014, 22:39 »

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

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
QPeter
Гость
« Ответ #2 : Март 07, 2014, 22:43 »

Так я же line_number задаю строку которая мне нужна, разве не так?
Записан
QPeter
Гость
« Ответ #3 : Март 07, 2014, 22:46 »

По условию задания файл нельзя открыть и всё сразу прочесть, тк в файл постоянно  будут добавляться новые значения.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Март 07, 2014, 23:00 »

Так я же line_number задаю строку которая мне нужна, разве не так?

ты документацию читал? Ответ - нет, не читал. readLine(N) читает из потока данные, но не более чем N символов. Это значит, что чтобы прочитать строку под номером 10 нужно сперва прочитать 9 предыдущих строк.
Записан
QPeter
Гость
« Ответ #5 : Март 07, 2014, 23:07 »

Читал, но этот момент не доглядел, Строит глазки

Ну а как тогда реализовать такую штуку? Есть какой нибудь оператор который будет читать именно ту строку которая мне нужна?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Март 07, 2014, 23:17 »

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

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Март 07, 2014, 23:22 »

По условию задания файл нельзя открыть и всё сразу прочесть, тк в файл постоянно  будут добавляться новые значения.
значит каждый раз считаешь сколько строк прочитано, потом пропускаешь столько строк при чтении и сохраняешь только новые
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
QPeter
Гость
« Ответ #8 : Март 07, 2014, 23:22 »

А можно считать файл, записать его в динамический массив например, а потом вытащить последнее значении массива и обнулить его перед проведением следующей итерации?
Записан
QPeter
Гость
« Ответ #9 : Март 07, 2014, 23:36 »

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

Но этот способ мне нравится больше, спасибо)
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #10 : Март 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()));
}
}
но все ж есть некоторые маленькие проблемы в подобной реализации... оставляю для самостоятельного исправления
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Март 08, 2014, 14:07 »

значит каждый раз считаешь сколько строк прочитано, потом пропускаешь столько строк при чтении и сохраняешь только новые
А не проще ли хранить размер прочитанного, а при след чтении делать seek?

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Март 08, 2014, 16:31 »

значит каждый раз считаешь сколько строк прочитано, потом пропускаешь столько строк при чтении и сохраняешь только новые
А не проще ли хранить размер прочитанного, а при след чтении делать seek?
действительно, так проще
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #13 : Март 08, 2014, 19:30 »

А откуда уверенность что "полная" строка была добавлена? Это может быть напр всего лишь буква (в той же строке)
ответ тут:
но все ж есть некоторые маленькие проблемы в подобной реализации... оставляю для самостоятельного исправления
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Март 09, 2014, 09:45 »

но все ж есть некоторые маленькие проблемы в подобной реализации...
Ну чего же "маленькие" если их решение заметно больше Вашего?  Улыбающийся
оставляю для самостоятельного исправления
А сам учитель может исправить или так, только задания дает?  Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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