Comment lire une ligne FIFO/nommée ligne par ligne à partir d'une application Linux C++/Qt?Comment lire une ligne FIFO/nommée ligne par ligne à partir d'une application Linux C++/Qt?
Aujourd'hui, je peux ouvrir et lire à partir d'un fifo à partir d'un programme Qt, mais je ne peux pas obtenir le programme pour lire les données ligne par ligne. Qt lit tout le fichier, ce qui signifie qu'il attend que l'expéditeur ferme sa session. Prenons un exemple avec quelques commandes shell pour montrer ce que je voudrais que l'application fasse.
d'abord créer un fifo
mkfifo MyPipe
Ensuite, nous pouvons utiliser le chat pour lire la fifo
cat MyPipe
Et puis nous envoyons des données avec un autre chat
cat > MyPipe
Et puis commencez à taper quelque chose, et chaque fois que vous frappez entrer, il arrive au lecteur. Et puis quand vous le fermez avec Ctrl + D les deux côtés se terminent.
Maintenant, l'expéditeur est facile à créer avec un QTextStream, vous avez juste besoin de vider quand vous voulez envoyer.
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();
Mais alors d'écrire un petit lecteur qui a lu ligne par ligne est où je suis coincé en ce moment, tous mes essais avec la lib Qt finit avec ce que je reçois les données, mais pas jusqu'à ce que l'expéditeur utilise file.close() sur le fifo. Pas quand il rougit, comme cela se produit lorsque j'utilise chat pour lire.
Comme cet exemple:
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'est-ce que je manque?
Il se sent juste comme je l'ai besoin d'utiliser une sorte de isReady ou lineAvailable sur cours d'eau ou quelque chose comme ça, mais je ne trouve rien dans les documents qui s'intègre ...
/Merci
Remarque:
Si je vais avec le style bas niveau c et lu un omble chevalier au moment où je fais obtenir le style Im mer rching pour. Mais ce serait bien de pouvoir faire le même style Qt.
FILE *fp;
fp=fopen("MyPipe", "r");
char c;
while((c=getc(fp)) != EOF)
{
printf("%c",c);
}
fclose(fp);
Mise à jour:
Quand je démarre un débogueur le programme est accroché au readLine(), et ne pas continuer jusqu'à ce que l'autre partie ferme la fifo.
Et je reçois la même chose en utilisant « >> »
line = in.readLine();
in >> line;
Se pourrait-il que le tube soit en train d'être lu immédiatement, et que c'est la sortie d'écran qui est tamponnée? Vous avez utilisé 'qDebug() << line;' et je ne vois aucun rinçage. –
Bon point, n'y ai pas pensé. – Johan