¿Cómo leo una línea FIFO/nombrada línea por línea desde una aplicación C++/Qt Linux?¿Cómo leo una línea FIFO/nombrada línea por línea desde una aplicación C++/Qt Linux?
Hoy puedo abrir y leer desde una fifo desde un programa Qt, pero no consigo que el programa lea los datos línea por línea. Qt lee el archivo completo, lo que significa que espera hasta que el "emisor" cierre su sesión.
Tomemos un ejemplo con algunos comandos de shell para mostrar lo que me gustaría que hiciera la aplicación.
En primer lugar crear un FIFO
mkfifo MyPipe
entonces podemos usar cat para leer de la FIFO
cat MyPipe
Y entonces enviamos algunos datos con otro gato
cat > MyPipe
Y luego comience a escribir algo, y cada vez que presione enter, llegará al lector. Y luego, cuando lo cierras con Ctrl + D, terminan ambos lados.
Ahora el remitente es fácil de crear con QTextStream, , solo necesita enjuagar cuando desea enviar.
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();
Pero entonces a escribir un pequeño lector que lee línea a línea es donde estoy atascado en este momento, todos mis intentos con el lib Qt termina con eso consigo los datos, pero no hasta que el remitente utiliza file.close() en el fifo. No cuando él descarga, como ocurre cuando uso cat para leer.
como en este ejemplo:
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();
¿Qué me falta?
Se siente como que necesito utilizar algún tipo de isReady o lineAvailable en la corriente o algo por el estilo, pero no puedo encontrar nada en la documentación que se ajusta ...
/Gracias
Nota:
Si voy con el estilo de bajo nivel C y con un carácter leído en el momento en que hago llegar al mar Im estilo rching para. Pero sería bueno poder hacer el mismo estilo Qt.
FILE *fp;
fp=fopen("MyPipe", "r");
char c;
while((c=getc(fp)) != EOF)
{
printf("%c",c);
}
fclose(fp);
actualización:
Cuando comienzo un depurador del programa está colgado en la readLine(), y no continuará hasta que la otra parte se cierra la FIFO.
Y me pongo la misma utilizando ">>"
line = in.readLine();
in >> line;
¿Podría ser que la tubería se esté leyendo inmediatamente, y en realidad es la salida de la pantalla que se está almacenando? Usaste 'qDebug() << line;' y no veo ninguna descarga. –
Buen punto, no pensé en eso. – Johan