1

我目前像这样逐行从文件中读取数据

readFile(QFile *file)
{
    QTextStream in(file);
    while(!in.atEnd())
    {
        // Do stuff
    }
}

我需要扩展它来处理当前正在写入的文件。while只有在 N 秒内没有任何内容写入文件时,循环才应退出。

这应该很容易通过添加一个计时器和一个睡眠/等待循环来实现,不断检查我们是否还在atEnd()。但是,文档不是很清楚,atEnd()如果新数据已附加到文件中,返回值是否会改变。

如果我使用 aQTextStream从正在写入的文件中读取,返回值会atEnd()准确反映文件内容的变化吗?

4

1 回答 1

2

atEnd() 的返回值会准确反映文件内容的变化吗?

是的

您可以通过执行以下函数来测试它:

void FileReader::_appendFileTest()
{    
    QFile file("/home/cklein/appendFile");
    file.open(QIODevice::ReadOnly);

    QTextStream in(&file);

    while(true)
    {
        while(!in.atEnd())
        {
            QString line = in.readLine();

            qDebug() << line;
        }
        SleepThread::msleep(1000);
    }
}

SleepThread取自这里的代码。它只是暴露了受保护的QThread::msleep()功能。

在应用程序运行时,在终端中输入

~ $ echo "foo" >> appendFile
~ $ echo "bar" >> appendFile

您可以看到,在不重置或重新打开文件的情况下,该atEnd()函数false在附加文件时返回 a。

于 2013-08-06T19:43:29.760 回答