gpt4 book ai didi

qt - 如何用 Qt 替换 .txt 文件中特定行的文本?

转载 作者:行者123 更新时间:2023-12-05 04:13:48 24 4
gpt4 key购买 nike

我有这个“data.txt”,里面有这段文字:

1;Bob;Patino;43
/2;Chris;Metsen;46
/3;Rob;Pardo;37
/4;Megan;Fox;25
/5;Cara;Delevingne;21

我想将第二行“Metsen”的文本替换为“Metzen”。我可以通过重写整个数据来做到这一点,这很容易,但对于大量数据来说可能不方便。

有没有办法只重写特定数据(最好使用 QFileQTextStream)?

最佳答案

从你的问题来看,你想在内存映射 IO 中进行替换,这在一般情况下是不可能的。如果文件不是 ASCII 编码的,或者如果替换文本与它替换的文本大小不同,会发生什么情况?只要您需要“插入”操作,无论您喜欢与否,您都在重写整个文件。此外,该文件仍然必须完全阅读才能搜索文本,因此无论如何它都不会成为一个很大的优化。现代磁盘驱动器的写入速度为每秒数百至数千兆字节,因此您的写入时间可能可以忽略不计。

更不用说您在尝试调试程序时几乎 100% 肯定会损坏原始数据。即使你做对了,如果进程终止,你也会破坏原始数据。这不是正确的方法。

也就是说,可以使用QFileQTextStream 的正则表达式来执行简单的子字符串替换。此程序读取 data.txt,更正拼写错误,并将结果写入名为 newData.txt 的新文件。

#include <QFile>
#include <QRegularExpression>
#include <QRegularExpressionMatch>
#include <QRegularExpressionMatchIterator>
#include <QTextStream>

int main(int argc, char *argv[])
{
QFile data("C:/workspace/simpleQtProject/data.txt");
data.open(QIODevice::Text | QIODevice::ReadOnly);
QString dataText = data.readAll();

QRegularExpression re("Metsen");
QString replacementText("Metzen");

dataText.replace(re, replacementText);

QFile newData("C:/workspace/simpleQtProject/newData.txt");
if(newData.open(QFile::WriteOnly | QFile::Truncate)) {
QTextStream out(&newData);
out << dataText;
}
newData.close();

return 0;
}

注意:QRegularExpression 的优化性能实际上非常好,但由于在 Debug模式下禁用了 JIT 编译器,调试可能会很慢。参见 peppe's blog post对实现的细微差别(以及发布性能的基准)进行很好的讨论。

此外,如果您的正则表达式变得更加复杂,并且您需要更精细地控制替换的执行方式,您可以使用 QRegularExpressionMatchIterator 语法和基于索引的 QString::替换()。这可以支持多个或命名的捕获组,或其他高级正则表达式功能。

#include <QFile>
#include <QRegularExpression>
#include <QRegularExpressionMatch>
#include <QRegularExpressionMatchIterator>
#include <QTextStream>

int main(int argc, char *argv[])
{
QFile data("C:/workspace/simpleQtProject/data.txt");
data.open(QIODevice::Text | QIODevice::ReadOnly);
QString dataText = data.readAll();

// Using regex match iterator. Overkill for simple substring replacement, but scalable
// to very complex replacements.
QRegularExpression re("Metsen");
QString replacementText("Metzen");

QRegularExpressionMatchIterator itr = re.globalMatch(dataText);

while(itr.hasNext())
{
QRegularExpressionMatch match = itr.next();
dataText.replace(match.capturedStart(0), match.capturedLength(0), replacementText);
}

QFile newData("C:/workspace/simpleQtProject/newData.txt");
if(newData.open(QFile::WriteOnly | QFile::Truncate)) {
QTextStream out(&newData);
out << dataText;
}
newData.close();

return 0;
}

关于qt - 如何用 Qt 替换 .txt 文件中特定行的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36679961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com