Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用Qt替换.txt文件中特定行的文本?_Qt - Fatal编程技术网

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

如何用Qt替换.txt文件中特定行的文本?,qt,Qt,我有一个“data.txt”,里面有这个文本: 1;Bob;Patino;43 /2;Chris;Metsen;46 /3;Rob;Pardo;37 /4;Megan;Fox;25 /5;Cara;Delevingne;21 我想用第二行“Metsen”替换“Metzen”。 我可以通过重写整个数据来做到这一点,这很容易,但对于大量的数据来说可能并不方便 有没有办法只重写特定数据(理想情况下使用QFile和QTextStream)?从您的问题中可以看出,您希望替换内存中映射的IO,这在一般情况

我有一个“data.txt”,里面有这个文本:

1;Bob;Patino;43
/2;Chris;Metsen;46
/3;Rob;Pardo;37
/4;Megan;Fox;25
/5;Cara;Delevingne;21
我想用第二行“Metsen”替换“Metzen”。 我可以通过重写整个数据来做到这一点,这很容易,但对于大量的数据来说可能并不方便


有没有办法只重写特定数据(理想情况下使用
QFile
QTextStream
)?

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

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

也就是说,可以使用带有
QFile
QTextStream
的正则表达式执行简单的子字符串替换。此程序读取
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;
}

在这种情况下,你只需要寻找s并在它的位置写一个z,但在任意替换的情况下,它就不会那么简单了,再加上有文本编码,它不是一个原始字节数组,所以你可能需要将整个文件读成一个字符串,进行任何替换,然后重写文件。
QRegExp
可能是您的朋友。@NicolasHolthaus您能举例说明它应用于QFile和QTextStream吗?@RobertoSepúlvedaBravo-regex不会帮助您,仅用于替换文件中的文本string@driver你是说.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();

    // 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;
}