Wie Std-out eines anderen Programms direkt einesen ?



  • Du liest aus stdin genauso wie aus Deiner Datei (natürlich ohne entpacken da Du scheinbar gzip-komprimiertes einliest).

    Wie liest Du denn aus der Datei? In welchem Format Du liest hängt natürlich davon ab was das andere Programm reingibt. Wenn Dein MyProg bisher (unkomprimierte) Daten aus der Datei liest (deren Name in argv[1]) steht, hast Du doch sowas:

    ifstream datei(argv[1], ios::in);
    

    oder ähnlich.

    Du brauchst jetzt eigentlich nur die Konstruktion von "datei" ganz rauswerfen und statt aus "datei" zu lesen aus "cin" lesen. Fertig 😉

    Ob das erzeugende Programm fertig ist erkennst Du (auch wie bei einer Datei) daran dass cin End-Of-File anzeigt (also wieder - statt datei.eof() nimmst Du cin.eof()), so als wäre Deine Eingabedatei einfach zuende. Wenn Du die Daten nicht schnell genug verarbeitest, wird das ausgebende Programm gezwungen zu bremsen (oder Daten zu verwerfen, je nachdem wie es geschrieben ist, aber bremsen ist die häufigste Form).

    EDIT:
    Dein Beispielbefehl müsste wenn, dann cin >> line heissen, aber das ist wie gesagt abhängig von den Daten die reinkommen (Binärdaten z.B. lassen sich mit Streaming-Ops nicht so super lesen 😉 )



  • Alles Plaintext ! Ziemliche Datenmengen unkomprimiert - deswegen gz

    Z.Z. mache ich es so, dass ich die gz-Datei als Parameter bekomme.
    Dann mache ich ein zlib.gzopen() darauf und mache dann ein zlib.gzread() das mir eine vorgegebene Menge an Zeichen in ein char-array packt. Daraus extrahiere ich mir dann jeweils eine ganze Zeile.

    Werde mir das mal ansehen. Danke !



  • Lass die Herumspielerei mit gz bleiben und nimm einfach alles komplett unkomprimiert entgegen; wenn Du irgendwas komprimiert brauchst, dann kannst Du das ja immer noch ein gzcat vor Dein Programm schalten, das ist für sowas sehr gut geeignet.



  • nman schrieb:

    Lass die Herumspielerei mit gz bleiben und nimm einfach alles komplett unkomprimiert entgegen

    Genau. Ich wußte nur nicht, wie. Das ist ja der Sinn meiner Frage gewesen 😉



  • Folgender Text wird vom erzeugenden Prozess ausgegeben:

    Zeile 1
    Zeile 2
    Zeile 3
    

    Mein Programm sieht wie folgt aus:

    string line;
    cin >> line;
    while (! cin.eof()) {
        cout << "read " << line << endl;
        cin >> line;
    }
    cout << "finished." << endl;
    

    Die Ausgabe meines Programmes ist:

    read Zeile
    read 1
    read Zeile
    read 2
    read Zeile
    read 3
    finished.
    

    Wie kann ich denn eine ganze Zeile (bis zum Zeilenende "\n") auf einmal einlesen ?
    Soll also so aussehen:

    read Zeile 1
    read Zeile 2
    read Zeile 3
    finished.
    

    Könnte jedesmal überprüfen, ob line mit "\n" endet und solange den Inhat zwischenspeichern - aber das muss doch auch anders gehen ?



  • getline(line, cin);
    

    😉



  • Ich kann dir ne Moeglichkeit in C liefern:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main()
    {
    	int pfds[2];
    
    	pipe(pfds);
    
    	if ( !fork() ) 
    	{
    		close( 1 );
    		dup( pfds[1] );
    		close( pfds[0] );
    		execlp( "./main1", "./main1", NULL );
    	} 
    	else 
    	{
    		close( 0 );
    		dup( pfds[0] );
    		close( pfds[1] );
    		execlp( "./main2", "./main2", NULL );
        }
    }
    

    Dabei schreibt main1 auf stdout und main2 liest von stdin.



  • ich schreibe ja nicht mir selbst 😉
    die software von der ich lese liegt mir nur als binary vor...

    aber danke euch trotzdem !



  • Du kannst dir zur Not jede Kommandozeile in die execlp()-Aufrufe reinpacken (wenn du es ganz dynamisch willst, kannst du dir die Programmnamen sogar per argv vom User geben lassen) - aber ich glaube, die von LordJaxom gelieferte Pipe-Schreibeweise dürfte das selbe machen wie Moe's Programm.

    (was das zeilenweise einlesen angeht: getline() ist die Lösung)



  • CStoll schrieb:

    ich glaube, die von LordJaxom gelieferte Pipe-Schreibeweise dürfte das selbe machen wie Moe's Programm.

    Ja, ist aber flexibler und unter Unix besserer Stil als das Programm von moe.


Anmelden zum Antworten