如何从 C++/Qt Linux 应用逐行读取 FIFO/命名管道?
现在我可以从 Qt 程序中打开和读取 fifo, 但我无法让程序逐行读取数据。 Qt 读取整个文件,这意味着他会一直等到“发送者”关闭他的 session 。
让我们以一些 shell 命令为例来展示我希望该应用执行的操作。
先创建一个fifo
mkfifo MyPipe
然后我们可以使用cat从fifo中读取
cat MyPipe
然后我们用另一只猫发送一些数据
cat > MyPipe
然后开始输入内容,每次您按下回车键,它就会到达阅读器。 然后,当您使用 Ctrl+D 关闭它时,两边都结束了。
现在使用 QTextStream 很容易创建发送者, 你只需要在你想发送的时候刷新。
QFile file("MyPipe");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QTextStream out(&file);
for(int i=0; i<3; i++) {
out << "Hello...: " << i << "\n";
out.flush();
sleep(2);
}
file.close();
但是写一个逐行阅读的小阅读器是我现在遇到的问题, 我对 Qt lib 的所有尝试都以我获得数据而告终,但是 直到发件人在 fifo 上使用 file.close() 。 不是在他脸红的时候,就像我用 cat 阅读时那样。
像这个例子:
QFile file("MyPipe");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return 0;
QTextStream in(&file);
QString line;
do {
line = in.readLine();
qDebug() << line;
} while (!in.atEnd());
file.close();
我错过了什么?
感觉就像我需要使用某种 isReady 或 lineAvailable 流或类似的东西, 但我在文档中找不到任何适合...
/谢谢
注意:
如果我使用低级 c 风格并同时读取一个字符,我会这样做 得到我正在寻找的风格。 但如果能够采用相同的 Qt 风格,那就太好了。
FILE *fp;
fp=fopen("MyPipe", "r");
char c;
while((c=getc(fp)) != EOF)
{
printf("%c",c);
}
fclose(fp);
更新:
当我启动调试器时,程序卡在 readLine() 上, 直到对方关闭fifo才继续。
我确实用“>>”得到了同样的结果
line = in.readLine();
in >> line;
最佳答案
使用低级 c 风格,一次读取一个字符。
FILE *fp;
fp=fopen("MyPipe", "r");
char c;
while((c=getc(fp)) != EOF)
{
printf("%c",c);
}
fclose(fp);
关于c++ - 如何从 C++/Qt Linux 应用程序逐行读取 FIFO/命名管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3861948/