在Qt中读取文本文件

时间:2011-02-08 08:55:25

标签: c++ qt qt4

我想阅读一个巨大的文本文件,其中我将根据逗号(,)划分字符串并将字符串存储在数组中。那怎么做呢。是否存在像badaOS一样的StringTokenizer操作的类。我尝试过QFile但它无法读取整个文件。

5 个答案:

答案 0 :(得分:10)

QTextStream允许您逐行阅读

QFile file(hugeFile);
QStringList strings;
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
    QTextStream in(&file);
    while (!in.atEnd()) {
        strings += in.readLine().split(";"); 
    }
}

答案 1 :(得分:1)

您可以使用文件流。

QFile file = new QFile(hugeFile);      
file.open(QIODevice.OpenModeFlag.ReadOnly);       
QDataStream inputStream = new QDataStream(file);
QStringList array;
QString temp;

while(!inputStream.atEnd()) {
  inputStream >> temp;
  array << temp.split(";");
}

请注意,这是未经测试的(伪)代码,希望它有所帮助。

答案 2 :(得分:0)

您可以随时阅读文件的一部分:

QFile file( ... );
file.read(1000); // reads no more than 1000 bytes

或者您开车逐行阅读您的文件:

file.readLine();

但是当一个字符串被分成两部分时,你将不得不处理这些情况。

答案 3 :(得分:0)

如果它是一个非常大的文件,那么你可以使用file.read(an_appropriate_number)读取,而file.atEnd()是false。

读取一个块(使用file.read()),将其添加到临时字符串缓冲区并搜索“,”(例如使用QString的contains()方法)。如果它包含','则将其拆分(使用QString的split()方法):前X个部分(读取1000个字符可能包含多个1个令牌)将包含找到的令牌,最后一个不是完整的令牌。因此,将临时字符串切换到拆分的最后一部分并读取另一个块(直到您点击file.atEnd())并将其附加到临时字符串缓冲区。除非您的代币很大,否则这将有效地工作。并且在点击file.atEnd()之后不要忘记处理上一个缓冲的文本:)

或者作为替代方案,您可以逐个字符地阅读文件并手动检查','但是读取超过1个字符总是更好(如果您阅读更多内容,则效率更高)。

答案 4 :(得分:0)

这不会捕获逗号后的空格。如果这是不可接受的,请随意优化正则表达式。您也可以减少顶部的包含数量。我只是在彻底。我在1600行文件上对此进行了测试,它似乎在Qt 5.6中处理得很好

#include <QCoreApplication>
#include <QFile>
#include <QIODevice>
#include <QRegularExpression>
#include <QRegularExpressionMatch>
#include <QRegularExpressionMatchIterator>
#include <QString>
#include <QStringList>
#include <QTextStream>

int main(int argc, char * argv[])
{
    QCoreApplication app(argc, argv);

    QFile file("C:\\PathToFile\\bigFile.fileExt");
    QStringList lines;
    QStringList matches;
    QString match;

    file.open(QIODevice::ReadOnly | QIODevice::Text);
    while(!file.atEnd())
    {
      lines << file.readLine();
    }
    file.close();

    QRegularExpression regex("(^|\\s|,)\\K\\w.*?(?=(,|$))");
    QRegularExpressionMatchIterator it;

    foreach (QString element, lines)
    {
        it = regex.globalMatch(element);

        while(it.hasNext())
        {
            QRegularExpressionMatch qre_match = it.next();
            match = qre_match.captured(0);
            matches << match;
        }
    }

    return 0;
}