2013-08-25 24 views
1

從文件中讀取數據,並保持在一個QHash如下:獲取指針回到第一線 - 一個QFile

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())循環不要錯過第一行是什麼時候?

回答

0

關閉文件與file.close()

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

,並重新打開它之前while(!file.atEnd()){...}解決了這個問題。

+2

或者您可以使用'QFile :: seek'將光標移動到文件的開頭。 – alexisdm

0

重置QFile是一種方法。可能還有其他人。看看這段代碼:

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'循環有更多的循環。 以上代碼更有效?更快?無Bug?不知道。但至少文件操作較少。 :-)

相關問題