-1

我在使用 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(&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 填充?!

有人能帮我吗?

谢谢!

4

1 回答 1

0

这是我尝试的解决方案:

只需将代码修改为,我的猜测是应该可以工作:

 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 的剩余行。

编写文件读取代码的最佳方法是在测试代码时始终打印正在读取的内容。请让我知道这对你有没有用 。

桑托什

于 2014-06-24T13:38:55.233 回答