C++ Qt - 读取文本文件的特定部分

C++ Qt - Reading specific portion of a text file

我想在列表小部件中读取文本文件的特定部分。我尝试了不同的方法并在网上寻找一些解决方案,但我找不到太多。我是 Qt 的新手,但大部分时间都相处得很好。

QFile YearInfo("C:/Users/Documents/info.txt");
        YearInfo.open(QIODevice::ReadWrite | QIODevice::Text);
        if(YearInfo.isOpen()){
            QTextStream in(&YearInfo);
            bool readEnabled = false;
            QString outputText, startToken = line, endToken = "*"; // line = "2019"
            while(!in.atEnd()){
               QString getLine = in.readLine();
               if(getLine == endToken){
                   readEnabled = false;
               }

               if(readEnabled){
                   outputText.append(getLine + "\n");
               }

               if(getLine == startToken){
                   readEnabled = true;
               }
            }
            ui->listWidget->addItem(outputText);
        }
            YearInfo.flush();
            YearInfo.close();

文本文件包含:

2019 职位划分标题日期 (W.M./R.M./J.R) *

2020 职位划分职称日期(P.M./V.R/S.T) *

只要您尝试提取按以下方式格式化的一段文本,您编写的代码就可以工作

2019
Position Division Title   <~~ this line is extracted
Date (W.M./R.M./J.R)      <~~ this line is extracted
More stuff                <~~ this line is extracted
*

如果你有以下格式的东西

2019 Position Division
Title Date (W.M./R.M./J.R) *
2019 Position Division Title Date (W.M./R.M./J.R) *

不会提取任何内容,因为当您找到包含 startToken 的行时开始提取。结束标记也一样。

您可以尝试按以下方式修改代码中的 while 循环

while(!in.atEnd()){
    QString getLine = in.readLine().trimmed();

    if(getLine.startsWith(startToken)){
        readEnabled = true;
    }

    if(readEnabled){
        outputText.append(getLine + "\n");
    }

    if(getLine.endsWith(endToken)){
        readEnabled = false;
    }
}

现在您正在检查 startsWith 行是否为 startToken。在这里我还添加了一个 trimmed 指令来删除每行开头和结尾的空格(以防万一......)。 endsWithendToken.

做同样的事情

另外最好以只读模式打开设备,因为无论如何你都不会修改它

YearInfo.open(QIODevice::ReadOnly | QIODevice::Text);

最后的flush也是多余的

希望这对您有所帮助 =)

要查找字符串的条目,我使用 QRegExp。请注意,由于您有一个 stopToken,就像 QRegExp 的特殊符号一样,它可能会更改为 "\*:

#include <QRegExp>
#include <QDebug>

QStringList tokenize(QString line, QString start, QString end)
{
    QRegExp rx(start+".*"+end);
    rx.indexIn(line);
    return rx.capturedTexts();
}

void test()
{
    qDebug()<<tokenize("2019 Position Division Title Date (W.M./R.M./J.R) *", "2019", "\*");
    // returned ("2019 Position Division Title Date (W.M./R.M./J.R) *")
    qDebug()<<tokenize("2020 Position Division Title Date (P.M./V.R/S.T) *", "2019", "\*");
    // returned ("")
}

您的函数必须如下所示:

...
while(!in.atEnd()){
    QString getLine = in.readLine();
    QStringList strL = tokenize(getLine, startToken, stopToken);
    if (strL.size())
       ui->listWidget->addItem(strL[0]);
}
        QFile YearInfo("C:/Users/Documents/info.txt");
        YearInfo.open(QIODevice::ReadOnly | QIODevice::Text);
        if(YearInfo.isOpen()){
            QTextStream in(&YearInfo);
            bool readEnabled = false;
            QString outputText = "", startToken = line.trimmed(), endToken = "*";

            while(!in.atEnd()){
                QString getLine = in.readLine().trimmed();

                if(getLine == startToken){
                    readEnabled = true;
                }

                if(readEnabled){
                    outputText.append(getLine + "\n");
                }

                if(getLine == endToken){
                    readEnabled = false;
                }
            }
            ui->listWidget->addItem(outputText);
        }
            YearInfo.close();