繁体   English   中英

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 Position 分区标题日期 (WM/RM/JR) *

2020 Position 分区标题日期(PM/VR/ST)*

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

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。 请注意,由于您有一个类似于 QRegExp 的特殊符号的 stopToken,因此它可能会更改为 "\*:

#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 ("")
}

您的 function 必须如下所示:

...
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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM