[英]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
指令,以删除每行开头和结尾的空格(以防万一......)。 对于endsWith
的endToken
也是如此。
此外,最好以只读模式打开设备,因为无论如何您都不会修改它
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.