1

ファイルからデータを読み取り、次のように QHash に保持します。

 QHash<int, QVector<float> >

私のデータ ファイルにはヘッダーが含まれていないため、最初にベクトルを作成してからファイル ループに入ると、最初の行にあるデータが失われます。私の情報源は次のとおりです。

    QFile file("...\\a.csv");
    if(!file.open(QIODevice::ReadOnly))
    {
        QMessageBox::warning(0, "Error", file.errorString());
    }

    QString fileLine = file.readLine();
    QStringList fileLineSplit = fileLine.split(',');
    hashKeySize = fileLineSplit.size();

    for(int t=0; t<hashKeySize; t++)
    {
        QVector<float> vec;
        hash_notClustered[t] = vec;
    }

    while(!file.atEnd())
    {
        QString line = file.readLine();
        QStringList list = line.split(',');
        for(int t = 0; t<list.size(); t++)
        {
            hash_notClustered[t].push_back(list[t].toFloat());
        }
    }

while(!file.atEnd())Q: 最初の行を見逃さないようにループしているときに、ポインタを最初の行に戻すにはどうすればよいですか?

4

2 に答える 2

0

でファイルを閉じるfile.close()

for(int t=0; t<hashKeySize; t++)
    {
        QVector<float> vec;
        hash_notClustered[t] = vec;
    }

while(!file.atEnd()){...}問題を解決する前に再度開く。

于 2013-08-25T15:18:16.577 に答える
0

QFile をリセットするのも 1 つの方法です。他にもあるかもしれません。このコードを見てください:

    QFile file("...\\a.csv");
    if(!file.open(QIODevice::ReadOnly)){
        QMessageBox::warning(0, "Error", file.errorString());
    }

    QString fileLine = file.readLine();
    QStringList fileLineSplit = fileLine.split(',');
    int hashKeySize = fileLineSplit.size();

    for(int t=0; t<hashKeySize; t++){
        QVector<float> vec;
        hash_notClustered[t] = vec;
    }

    do{
        for(int t = 0; t<fileLineSplit.size(); t++){
            hash_notClustered[t].push_back(list[t].toFloat());
        }
        fileLine      = file.readLine();
        fileLineSplit = fileLine.split(',');
    }while(!fileLine.isEmpty());

C++ には、'for' および 'while' ループよりも多くのループがあります。上記のコードはより効率的ですか? もっと早く?バグフリー?わかりません。しかし、少なくともファイル操作では少なくなります。:-)

于 2013-08-25T20:19:31.337 に答える