现在的位置: 首页 > 综合 > 正文

Qt中把纯文本里的int型数据转化为int数组(矩阵)

2014年08月13日 ⁄ 综合 ⁄ 共 2139字 ⁄ 字号 评论关闭

问题是这样:我有一个纯文本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;
}

结果如下:

数组(矩阵)如下:

抱歉!评论已关闭.