Unnamed FIFOs Zeichen für Zeichen lesen

16/08/2014 - 13:52 von Lukas Fink | Report spam
Hallo,

ich habe folgendes Problem:
Ich habe ein C++-Programm (làuft unter Linux), welches erkennt, ob es
mit einer unnamed Pipe/FIFO oder mit einem Terminal/Zeichengeràtedatei
als stdin aufgerufen wurde.
Das, was es im Falle eines Terminals vollbringen soll funktioniert
problemlos, nur das im Falle eines FIFOs bekommen ich nicht hin:

Es soll sobald ein Zeichen verfügbar ist, dieses sofort lesen, nach
stdout kopieren und in einen string anhàngen (ich verwende
string.push_back). Bei einem soll es den string mit einem anderen
vergleichen und sofern sie sich unterscheiden, den string leeren und
weitermachen, wenn sie gleich sind breaken.

Die Lösung sollte auch möglichst viel über Standard-C++ laufen, und der
Rest sich möglichst einfach in eine andere Datei verlagern.

Ich verwende dafür folgenden Code:

string str;
char c;

do {
str = ""; // String leeren
do {
c = cin.get ( ); // Zeichen lesen

cout.put ( c ); // Zeichen schreiben
str.push_back ( c ); // Zeichen dem string anfügen
}
while ( c != '' ); // Zeichen mit vergleichen

}
while ( str.size ( ) >= satanmsg.size ( ) && str.substr ( 0,
satanmsg.size ( ) ) == satanmsg ); // Zuerst prüfen, dass der string
min. gleich groß wie der const ist, dann ob die der Anfang von dem
string mit meinem const übereinstimmen.

Leider fàngt er nach wenigen Zeichen an, nicht mehr zu lesen.
Ich habe auch schon versucht, tee zwischen die Pipe zu hàngen, um zu
sehen ob es an meinem Programm liegt und in der von tee erstellten Datei
war die gesamte Ausgabe zu finden.

Ich hab auch noch das Problem, dass mein Programm nach Schließen der
Pipe weiterlàuft, sodass man es manuell per <Ctrl>+C schließen muss.

Lukas Fink
 

Lesen sie die antworten

#1 Alexander Wolf
17/08/2014 - 09:19 | Warnen spam
On 2014-08-16, Lukas Fink wrote:
ich habe folgendes Problem:
Ich habe ein C++-Programm (làuft unter Linux), welches erkennt, ob es
mit einer unnamed Pipe/FIFO oder mit einem Terminal/Zeichengeràtedatei
als stdin aufgerufen wurde.
Das, was es im Falle eines Terminals vollbringen soll funktioniert
problemlos, nur das im Falle eines FIFOs bekommen ich nicht hin:

Es soll sobald ein Zeichen verfügbar ist, dieses sofort lesen, nach
stdout kopieren und in einen string anhàngen (ich verwende
string.push_back). Bei einem soll es den string mit einem anderen
vergleichen und sofern sie sich unterscheiden, den string leeren und
weitermachen, wenn sie gleich sind breaken.



Schuss aus der Hüfte:

#include <iostream>
#include <string>
#include <cstdlib>

int main(void){

std::string input;
std::string cmp("Test");

while(getline(std::cin, input)){

std::cout << input << std::endl;
if(input == cmp) break;
}

return EXIT_SUCCESS;
}

HTH,
Alex
Wenn du es eilig hast, geh langsam. Wenn du es noch eiliger hast, mach
einen Umweg.
(Japanische Weisheit)

Ähnliche fragen