Qt считывает текстовый файл с помощью QTextStream

#c #qt #qtextstream

#c #qt #qtextstream

Вопрос:

У меня возникли проблемы с чтением текстового файла с помощью Qt. Мой текстовый файл выглядит следующим образом:

 17,9001500000000    31,1151700000000    450 0   NaN NaN NaN NaN NaN NaN
1   1   1390309311,00000    0,999847695156391   0,999847695156391   0,999847695156391   0,999847695156391   0,999847695156391   0,999847695156391   0,999847695156391
1   2   1390309311,00000    0,999695413509548   0,999695413509548   0,999695413509548   0,999695413509548   0,999695413509548   0,999695413509548   0,999695413509548
 

и так далее..

Данные разделяются пробелом

Первая строка: первые столбцы первой строки записываются с информацией, которая мне нужна в целом для следующих строк. Используется не каждый столбец в первой строке. После небольшой информации столбцы заполняются «NaN».

Следующие строки: здесь размещаются мои данные. Я хочу прочитать все это построчно. Первые 3 столбца снова являются общей информацией для строки, следующие (скажем, 300 столбцов) заполнены 3 различными типами данных (каждый тип размером 100 измерений).

Итак, я прочитал свой файл: сначала, если я прочитаю в первой строке, я хочу получить общую информацию для всего файла. (info1, info2, info3, info4) Затем я прочитал следующие строки, разделенные пробелом.

 if (!File.open(QIODevice::ReadOnly | QIODevice::Text))
            return false;

        QTextStream in(amp;metFile);
        QString line;
        int linecount = 0;

        double info1,info2,info3,info4;
double lineinfo1,lineinfo2,lineinfo3;

        while (!in.atEnd()) {

            if (linecount==0) {

                    in >> info1 >>  info2 >>  info3 >> info4;
                    linecount  ;

            }
            else {

            line = in.readLine();

            QStringList lineparts = line.split(QRegExp("\s "));

lineinfo1=lineparts[0].toFloat;
lineinfo2=lineparts[1].toFloat;
lineinfo3=lineparts[2].toFloat;

            for (int count=1; count<=100;count  ) {

                    float data1=lineparts[count 2].toFloat();
                    float data2=lineparts[100 count 2].toFloat();
                    float data3=lineparts[2*100 count 2].toFloat();

            }

            linecount  ;

            }
 

}

Теперь info1-4 считываются правильно. Но после этого lineinfo1-3 и data1-3 (lineparts[0] и т.д.) заполняются nan или 0 ?!

Кто-нибудь может мне помочь?

Спасибо!

Ответ №1:

Вот мое решение, чтобы попробовать:

Просто измените код на, и я предполагаю, что это должно сработать:

  if (linecount==0) {

    in >> info1 >>  info2 >>  info3 >> info4;
    QString  remaining_line = in.readLine();  //This should pass from NaN's to next line inside your else
    linecount  ;

 }
 

Я предполагаю, что в вашем коде после чтения первых четырех чисел элемент управления все еще находится в первой строке, а внутри «else», когда вы читаете строку, он считывает оставшуюся строку, где есть только NaN.

Лучший способ при написании кодов чтения файлов — это всегда печатать то, что вы читаете, при тестировании вашего кода. Дайте мне знать, если это сработает для вас.

Сантош

Комментарии:

1. вы правы. Я не прочитал всю строку в цикле ‘linecount == 0’. Спасибо!