Qt用QTextStream读取文本文件

时间:2014-06-24 13:10:30

标签: 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

依旧......

数据由空格分隔

第一行:第一行的第一列用我通常需要的信息写入以下行。并非使用第一行中的每个coloumn。在一些信息之后,列中填充了" 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填充?!

有人可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分: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的剩余行。

编写文件读取代码的最佳方法是在测试代码时应始终打印正在阅读的内容。让我知道它是否适合你。

桑托什