Qt读取制表符分隔文本文件的特定列

时间:2015-03-03 00:23:01

标签: c++ qt qtextstream

我正在开发一个程序,该程序读取制表符分隔的双精度文本文件,并对每列进行求和,从而有效地计算每列的积分。

我希望能够做的是选择一个特定的列来总结而不是总结所有列。

我已经为所有列的积分工作了代码:

void MainWindow::on_pushButton_clicked()
{


    data::SingleLineData.resize(512);
    QString test;
    QString inputfile = QFileDialog::getOpenFileName(
                this,
                tr("Open File"),
                "/Users",
                "All files (*.*)"
                );

    if(inputfile != ""){
    QFile file(inputfile);


    if(!file.open(QFile::ReadOnly)){
       }
    QTextStream in(&file);


        double buffer;

        while(!file.atEnd()){
            in.readLine();
            for(int i=0; i<512; i++){
                in >> buffer;
                data::SingleLineData[i]+=buffer;
            }
        }

    }
        qDebug() << data::SingleLineData;
// ************* file output **************************************************

        QString filename = QFileDialog::getSaveFileName(
                    this,
                    tr("Save File"),
                    "/Users",
                    "Text files (*.txt)"
                    );
        QFile fileout(filename);
        if (fileout.open(QFile::ReadWrite | QFile::Truncate)){
         QTextStream out(&fileout);
         for (QVector<double>::iterator iter = data::SingleLineData.begin(); iter != data::SingleLineData.end(); iter++){
             out << *iter <<", ";
         }
         fileout.close();
        }
}

这是我尝试使用整数输入到旋转框中选择单个列:

void MainWindow::on_pushButton_2_clicked()
{
    QString inputfile = QFileDialog::getOpenFileName(
                this,
                tr("Open File"),
                "/Users",
                "All files (*.*)"
                );
    QVector<double> SingleChannel;

    if (inputfile != ""){
        QFile file(inputfile);

        if (!file.open(QIODevice::ReadOnly)){
        }
        QTextStream in(&file);
        SingleChannel.resize(1);
        double buffer;
        int channelnumber = ui->spinBox->value();
        while(!file.atEnd()){
            in.readLine();
            for (int i = 0; i < 512; i++){
                in >> buffer;
                if (i == channelnumber){
                    SingleChannel.push_back(buffer);
                }
                data::SingleLineData[i]+=buffer;
            }
        }
    }
    qDebug() << SingleChannel;
}

我收到以下错误:

ASSERT failure in QVector<T>::operator[]: "index out of range", file /Users/mduncan/Qt/5.3/clang_64/lib/QtCore.framework/Headers/qvector.h, line 385
The program has unexpectedly finished.

有人有什么想法吗?

谢谢:)

1 个答案:

答案 0 :(得分:0)

在void MainWindow :: on_pushButton_2_clicked方法的开头添加此行

data::SingleLineData.resize(512); 

这会将容器的大小调整为512个默认值计数元素。因为你使用data :: SingleLineData [i] + = buffer,它需要访问容器中的第i个元素。