在Qt5应用程序上读取CSV文件时出现无限循环

问题描述 投票:0回答:1

我目前正在使用可处理CSV文件的Qt应用程序。我已经实现了一种方法,该方法的唯一目的是在控制台上显示内容(目前)。

这里是相关代码:

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编译代码。

c++ qt csv if-statement fstream
1个回答
0
投票

您应该:

  1. 打开文件->检查是否失败
  2. 逐行阅读所有内容

  3. 跳过空白部分将矢量,列表,数组或任何...

-

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.