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
指令来删除每行开头和结尾的空格(以防万一......)。 endsWith
对 endToken
.
做同样的事情
另外最好以只读模式打开设备,因为无论如何你都不会修改它
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();
我想在列表小部件中读取文本文件的特定部分。我尝试了不同的方法并在网上寻找一些解决方案,但我找不到太多。我是 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
指令来删除每行开头和结尾的空格(以防万一......)。 endsWith
对 endToken
.
另外最好以只读模式打开设备,因为无论如何你都不会修改它
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();