Бесконечный l oop при чтении файла CSV в приложении Qt5 - PullRequest
1 голос
/ 06 мая 2020

В настоящее время я работаю над приложением Qt, которое работает с файлами CSV. Я реализовал метод, единственной целью которого является отображение содержимого на консоли (на данный момент).

Вот соответствующий код:

Class AppMainWindow, метод loadCsv

void AppMainWindow::loadCsv() {
    cout << "Sélection du fichier" << endl;

    QString fileName = QFileDialog::getOpenFileName(NULL, "Ouvrir un fichier", QString(), "Tableau CSV (*.csv)");
    if (fileName != NULL && !fileName.isEmpty()) {
        cout << "Ouverture du fichier \"" << fileName.toStdString() << "\"" << endl;
        string name = fileName.toStdString();
        vector<vector<string>> data = CsvReader::readCsv(&name);
    } else
        cout << "Pas de fichier sélectionné" << endl;
}

CsvReader.h

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

namespace CsvReader {
    vector< vector<string> > readCsv(string *fileStream);
}

CsvReader. cpp

#include "src/com/alten/utility/CsvReader.h"

vector<vector<string>> CsvReader::readCsv(string *fileName) {
    vector < vector<string> > data;
    string line;

    ifstream fileStream(*fileName);
    while (getline(fileStream, line)) {
        vector < string > row;
        string element;

        cout << "Ligne :" << line << endl;

        stringstream lineStream(line);
        while (getline(lineStream, element, ',')) {
            cout << "Item :" << element << endl;
            row.push_back(element);
        }

        data.push_back(row);
    }

    fileStream.close();
}

Когда я загружаю любой CSV-файл, loadCsv выполняется нормально до конца оператора if, после чего приложение Qt внезапно зависает.

Когда я удаляю оператор if, этой проблемы не возникает:

void AppMainWindow::loadCsv() {
    cout << "Sélection du fichier" << endl;

    QString fileName = QFileDialog::getOpenFileName(NULL, "Ouvrir un fichier", QString(), "Tableau CSV (*.csv)");
    cout << "Ouverture du fichier \"" << fileName.toStdString() << "\"" << endl;
    string name = fileName.toStdString();
    vector<vector<string>> data = CsvReader::readCsv(&name);
}

Я не Cpp -флюент, может ли кто-нибудь объяснить мне, откуда взялась ошибка?

NB: Я компилирую свой код с помощью cmake.

1 Ответ

0 голосов
/ 06 мая 2020

вы должны:

  1. открыть файл -> проверить, не удалось ли что-то
  2. прочитать все построчно

  3. пропустить пустые части pu sh каждую строку в векторе, списке, массиве или что-то еще ...

-

bool parseCsvFileQt(const QString& filename, QVector<QString>& row)
{
    QFile file(filename);
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug() << file.errorString();
        return false;
    }
        QString line = file.readAll();
        line = line.remove("\r");
        QStringList arrayOfLines = line.split("\n", QString::SkipEmptyParts);

        for(int i = 1; i < arrayOfLines.size(); i++)
        {
            row.push_back(arrayOfLines[i]);
        }
    return true;
}
...