【问题标题】:How to read updating text file with Qt?如何使用 Qt 读取更新的文本文件?
【发布时间】:2015-08-25 10:14:06
【问题描述】:

我有一个应用程序(我没有源代码),它将其输出打印到控制台。我正在将其输出写入文件,例如;

./otherApp > out.txt

使用 c++ qt 编程,我正在编写一个应用程序,该应用程序还应该同时读取其输出。但是我的代码只是读取创建的 out.txt 文件。我的意思是当 otherApp 继续写入输出时,如果我的项目完成读取,它不会读取输出文件的其余部分。

这是使用 QTextStream 读取输出的常用方法。

QString fileName = "/.1/Work/appOutput/out1";

QFile inputFile(fileName);
if(inputFile.open(QIODevice::ReadOnly))
{
    QTextStream in(&inputFile);
    while(!in.atEnd())
    {
        QString line = in.readLine();

        qDebug() << line;
    }
    inputFile.close();
}

我的问题是如何在我关闭 otherApp 或在其中没有写入任何内容之后读出文本文件?

编辑:

感谢@Bowdzone,我更改了我的代码并且它正在工作。这是我的代码。

    QString program = "/.1/Work/otherApp";
    QStringList arguments;
    arguments << "-x" <<  "1002";

    QProcess *myProcess = new QProcess();
    myProcess->start(program, arguments);

    QString strOut = myProcess->readAllStandardOutput();

    qDebug() << QTime::currentTime().toString() << strOut;

    myProcess->waitForFinished();

但是,一旦应用程序登录,qDebug() 就不会显示 otherApp 的输出。看起来不应该放置myProcess-&gt;waitForFinished(),因为一旦应用程序启动它就会创建另一个进程,并且我在 Qt 项目中看不到日志。您能帮我如何同时查看日志吗?

【问题讨论】:

  • 您可以使用QProcess 从您的应用程序中启动另一个应用程序,并使用其方法直接读取输出,而不必使用文本文件。
  • @Bowdzone 你能给我小样本更清楚吗?
  • 这一切都在文档中。 Here 它向您展示了如何使用 QProcess 启动外部程序。然后,每当程序向标准输出写入内容时,它就会发出readyReadStandardOutput() 信号,您可以使用readAllStandardOutput() 读取该信号
  • @Bowdzone 你能看看我的最新编辑吗

标签: c++ qt text output


【解决方案1】:

另一种方法是使用QFileSystemWatcher 并在发出QFileSystemWatcher::fileChanged 信号时读取文件,而不是从QProcess 读取标准输出。但是,您需要记住您停止阅读的位置或丢弃您已经阅读的内容,因此如果可能切换到标准输出会更方便。

【讨论】:

  • 是的,我需要知道我将如何记住我的最后一行?因为没有要记住的描述性内容。
  • @goGud 这只是一个建议,您必须自己进行测试,但您要做的是记住 QTextStream::pos() 值,然后在重新打开文件时使用 QTextStream::seek() 将流定位在你停止的位置。但是,同样,如果没有限制,为什么您不能使用标准输出,请使用它。如果没有,文件是唯一的方法,而不是尝试这个组合。
  • 能否请您查看我的最新编辑。也许在那之后你的解决方案可以解决我的问题。
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多