Возвращаем указатель на первую строку — QFile

Прочитайте данные из файла и сохраните их в 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());
}
}

Q: как я могу вернуть указатель на первую строку при цикле с while(!file.atEnd()) не пропустить первую строчку?

1

Решение

Закрытие файла с file.close()

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

и открыть его раньше while(!file.atEnd()){...} решает проблему.

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.
Является ли приведенный выше код более эффективным? Быстрее? Без ошибок? Без понятия. Но хотя бы на файловой операции меньше. 🙂

0

По вопросам рекламы [email protected]