问题是这样:我有一个纯文本data.txt文件,里面保存的都是int型数据,如下:
我想用Qt把该文本读取出来,并保存成int的数组。
我在一个类里写一个函数解决这个问题,如下:
int** ImageMat::DateFile2ArrInt(QString fileName,int *prow, int *pcol) { // 把读取的文件转换成二维数组保存,fileName为文件名,prow为行数,pcol为列数 int **result; QFile file(fileName); if(file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); QRegExp rx("(\\d+)"); QString dataString(""); int row=0; int col=0; int n=0; while(!stream.atEnd() && n < 12) { QString currentLineData = stream.readLine(); QStringList list; if(currentLineData.isNull()||currentLineData.isEmpty()) { break; } // 下面是提出数据型数据(过滤掉abc等字符)保存到list int pos = 0; while ((pos = rx.indexIn(currentLineData,pos)) != -1) { list << rx.cap(1); pos += rx.matchedLength(); } // 下面是测试 if(n==0){col = list.size();} if (col != list.size()) { // 如果文件保存的不是矩阵 QMessageBox::information(NULL,"Error", "The data in file is not matrix!\nline="+ QString::number(n+1) + "\ncol="+QString::number(col) + " list.size="+QString::number(list.size()) ); return NULL; } n++; dataString += list.join(QString(" "))+" "; } row = n; dataString.resize(dataString.size()-1); QStringList dataStringList = dataString.split(QRegExp("\\s+")); if(dataStringList.size() != row*col){return NULL;} // 数据对齐有问题 // 下面把数据保存成二维整数矩阵中去 *prow = row; *pcol = col; result = new int*[row]; for (int i=0; i<row; i++) { result[i] = new int[col]; } int index = 0; for (int i=0; i<row; i++) { for (int j=0; j<col; j++) { result[i][j] = dataStringList.at(index++).toInt(); } } } else { QMessageBox::information(NULL,"FileOpenError","This file does't exist!"); return NULL; } return result; }
我在另一个类里调用该方法,下面代码中的imageMat是类上面代码中类IMageMat的对象
void MainWindow::go() { QString fileName = QFileDialog::getOpenFileName(this, QObject::tr("Open Image Name List File"), ".", QObject::tr("Image File(*.txt)")); if (fileName.isEmpty()) {return;} int **dataInt; int *prow = new int; int *pcol = new int; dataInt = imageMat->DateFile2ArrInt(fileName,prow,pcol); imageMat->showArrInt(dataInt,*prow,*pcol); }
其中IMageMat里的showArrInt方法实现如下:(功能为显示整型数组)
void ImageMat::showArrInt(int **arr, int row, int col) { //显示数组结果 if(!arr){return;} QString resultString = "Matrix:" + QString::number(row) + "x" + QString::number(col) + "\n"; for (int i=0; i<row; i++) { for (int j=0; j<col; j++) { resultString += QString::number(arr[i][j]) + " "; } resultString += "\n"; } QMessageBox::information(NULL,"Matrix",resultString); return; }
结果如下:
数组(矩阵)如下: