2013-08-25 7 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()); 
     } 
    } 

Q: Как я могу получить указатель назад к первой строке, когда цикл с 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++ имеет больше циклов, чем цикл «для» и «while». Является ли выше код более эффективным? Быстрее? Без ошибок? Без понятия. Но по крайней мере на файловой операции меньше. :-)