如何在c++ / Qt中递归地将数据写入文本文件

How to recursively write data to a text file in C++/ Qt

本文关键字:数据 文件 文本 递归 c++ Qt      更新时间:2023-10-16

我有一个c++ Qt程序,它扫描特定目录下的文件。我试图将路径写入文本文件中包含的文件,但我所能做的就是将路径写入最后一个文件。

void ScanDir::qDirIteratorScanner(QString path)
{
    QDirIterator it(path, QStringList() << "*.mp4", QDir::Files, QDirIterator::Subdirectories);
    while (it.hasNext())
    {
        WriteToFile writeToFile(path, it.next());
        qDebug() << "it.next()";
    }
}

WriteToFile::WriteToFile(QString path, QString data)
{
    path += "/Data.txt";
    QFile file(path);
    if (file.open(QFile::ReadWrite)) {
        QTextStream stream(&file);
        stream << data << endl;
    }
}

如何将所有路径写入文本文件?

您在每次调用WriteToFile时都以读写模式创建QFile:这将截断文件的内容,因此仅保留上次调用写入的内容。

试题:

void ScanDir::qDirIteratorScanner(QString path)
{
    QDir dir(path);
    QFile file(dir.absoluteFilePath("Data.txt"));
    if (file.open(QFile::ReadWrite)) {
        QTextStream stream(&file);
        QDirIterator it(
            dir,
            QStringList() << "*.mp4",
            QDir::Files,
            QDirIterator::Subdirectories
        );
        while (it.hasNext())
        {
            stream << it.next() << endl;
        }
    }
}

这里文件只打开一次。如果您希望/需要保留WriteToFile函数,则将stream作为附加参数传递(通过引用)。

注意:

根据Simon Kraemer在评论中提出的建议,我使用QDir::absoluteFilePath,因为它可以更容易地防止路径中丢失或意外的斜杠。


保留设计的另一种选择可能是使用QFile::Append模式:

void ScanDir::qDirIteratorScanner(QString path)
{
    QDir dir(path);
    // reset the file
    {
        QFile file(dir.absoluteFilePath("Data.txt"));
        file.open(QFile::ReadWrite);
    }
    QDirIterator it(
        dir,
        QStringList() << "*.mp4",
        QDir::Files,
        QDirIterator::Subdirectories
    );
    while (it.hasNext())
    {
        WriteToFile writeToFile(path, it.next());
        qDebug() << "it.next()";
    }
}
WriteToFile::WriteToFile(QString path, QString data)
{
    QDir dir(path);
    QFile file(dir.absoluteFilePath("Data.txt"));
    if (file.open(QFile::Append)) {
        QTextStream stream(&file);
        stream << data << endl;
    }
}

每次打开文件并写入一行,覆盖文件中的任何内容。相反,尝试以追加模式打开它,这将导致您写入的内容被添加到文件的末尾。

QTextStream流(和文件,QIODevice::附加),

你必须以"append"模式打开文件,否则你将在每次打开文件时重写它的内容:

file.open(QFile::Append)

2注释:

  • 从构造函数写入文件似乎有问题。为什么不直接声明一个函数呢?
  • 你为什么不把文件打开一次呢?

    void ScanDir::qDirIteratorScanner(QString path)
    {
        QFile file(QDir(path).absoluteFilePath("Data.txt"));
        if(file.open(QFile::WriteOnly))
        {
            QTextStream stream(&file);
            QDirIterator it(path, QStringList() << "*.mp4", QDir::Files, QDirIterator::Subdirectories);
            while (it.hasNext())
            {
                stream << it.next() << endl;
                qDebug() << "it.next()";
            }
        }
    }
    

将文件打开和写入移动到qDirIteratorScanner()而不是WriteToFile()将是最有效的。这样你就可以打开文件,写入所有内容,然后关闭文件。

你现在所拥有的是你在每次迭代中打开(和覆盖)同一个文件。这就是为什么你只剩下最后一个字。或者,您可以打开带有QIODevice::Append标志的文件,但与第一个建议相比,这只是不必要的操作,在第一个建议中,您只需打开文件一次即可写入所有内容。