天天看點

Qt擷取執行檔案路徑(linux下和window下通用)、讀取CSV資料

系統1:ThinkPad T570、Windows10、QT5.12.2(Qt Creater 4.8.2)

系統2:NVIDIA Tegra X2 、Ubuntu 16.04LTS、QT5.5.1(Qt Creater 3.5.1)

建立一個Qt Widget Application應用程式,該程式實作的功能為:讀取執行程式所在路徑的上一層路徑下csvdata/CapRas_016_B.csv檔案(該檔案中存放的為double類型的亮度資料),并将讀取到的QString類型的資料轉換為double類型

在mainwindow.cpp中代碼如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QList>
#include <QStringList>
#include <QTextStream>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QString     wstrFilePath;
    wstrFilePath = qApp->applicationDirPath() + "/../../csvdata/CapRas_016_B.csv" ;
    //qApp->applicationDirPath()擷取到目前執行程式所在路徑,   ../表示傳回到上一個檔案夾,在window下的路徑比在linux下多一個debug檔案夾(debug模式下)
    QString FILE_PATH(wstrFilePath);
    QFile csvFile(FILE_PATH);
    QStringList CSVList;
    CSVList.clear();
    if (csvFile.open(QIODevice::ReadWrite))
    {
        QTextStream stream(&csvFile);
        while (!stream.atEnd())
        {
            CSVList.push_back(stream.readLine());
        }
        csvFile.close();
        int ncolumn,nrow;
        nrow = CSVList.size();
        ncolumn = nrow;
        if(!CSVList.empty())
        {
            QString strtemp = CSVList.first();
            QStringList qslisttemp = strtemp.split(",");
            ncolumn = qslisttemp.size();
            double *dCsvData = new double[ncolumn*nrow];
            //由于ncolumn*nrow個double達到12M,不能放在棧上面,是以不能通過double dCsvData[ncolumn*nrow];的方式申請記憶體,隻能通過new的方式在堆上面申請
            for(int i = 0;i<nrow;i++)
            {
                QString str1 = CSVList.at(i);
                QStringList qslist = str1.split(",");
                for(int j = 0;j<ncolumn;j++)
                {
                    dCsvData[i*ncolumn+j] = qslist.at(j).toDouble();
                }
                qDebug()<<dCsvData[i*ncolumn];//輸出每一行的第一個資料
            }
        }
            qDebug() <<"ncolumn = "<<ncolumn<< "nrow = "<<nrow<<"\n";//輸出csv檔案的列和行數
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}
           

繼續閱讀