如何以C ++ / Qt递归地将数据写入文本文件

时间:2016-11-08 15:36:11

标签: c++ qt

我有一个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;
    }
}

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

4 个答案:

答案 0 :(得分:4)

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

尝试:

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

答案 1 :(得分:2)

每次打开文件并向其写入一行时,都会覆盖文件中的内容。相反,尝试在追加模式下打开它,这应该导致你写的任何内容被添加到文件的末尾。

QTextStream流(&amp; file,QIODevice :: Append);

答案 2 :(得分:2)

您必须以“追加”模式打开文件,否则每次打开文件时都会覆盖其内容:

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()";
            }
        }
    }
    

答案 3 :(得分:1)

最有效的方法是将文件打开并写入qDirIteratorScanner()而不是WriteToFile()。这样您就可以打开文件,编写所有内容,然后关闭文件。

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