Pipes vs. scanf oder so



  • Hallo!

    Ich möchte gerne über eine Pipe in den Eingabepuffer eines Konsolenprogrammes schreiben. Das Schreiben selbst über WriteFile scheint auch wunderbar zu funktionieren, WriteFile liefert TRUE und die Zahl der geschriebenen Bytes ist auch gültig, aber was muss ich machen, damit das von dem Programm auch eingelesen wird?



  • Mhm, das lesende Programm liest einfach aus dem Standard-Eingabestrom:

    Sei Dein Programm test.exe:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	string zeile;
    	int i = 1;
    	while(getline(std::cin, zeile))
    	{
    		cout << i << ". -- " << zeile << '\n';
    		++i;
    	}
    }
    

    Dann kannst Du zB mit

    dir | test
    

    die Ausgaben von dir an Dein Programm pipen.



  • nein so war das nicht gemeint.

    also:
    - mit createprocess (konsolen- )programm starten, welches scanf verwendet
    - mit writefile eingabedaten an die pipe schreiben

    das problem ist, dass scanf irgendwie nicht zurück kehrt, wenn ich z.B. schreibe

    WriteFile(inputwritehandle, "help", strlen("help") + 1, &byteswritten, NULL);
    

    daher vermute ich jetzt, dass da noch irgend etwas anderes getan werden muss, die frage ist nur: was ist das genau?

    unter linux scheint das problem jedenfalls das gleiche zu sein, obwohl low-level-io mit read und write eindeutig funktioniert.



  • Dazu musst Du vorher dafür sorgen, dass der Standard-Eingabestrom des Programmes, dass Du starten willst und das lesen soll, auf die Pipe umgebogen wird:

    https://msdn.microsoft.com/de-de/library/windows/desktop/ms682499(v=vs.85).aspx



  • ja das habe ich auch getan, mehr oder weniger nach diesem beispiel:

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx

    anderes ende der pipes ist geschlossen, daten werden erfolgreich geschrieben.

    allerdings wird auch in dem beispiel low-level-io verwendet und ich möchte gerne ein fertiges programm starten, welches allem anschein nach keinen handle auf stdin anfordert und dann mit writefile irgendetwas schreibt, sondern scanf, gets oder was auch immer verwendet.



  • Wade1234 schrieb:

    ja das habe ich auch getan, mehr oder weniger nach diesem beispiel:

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx

    anderes ende der pipes ist geschlossen, daten werden erfolgreich geschrieben.

    allerdings wird auch in dem beispiel low-level-io verwendet und ich möchte gerne ein fertiges programm starten, welches allem anschein nach keinen handle auf stdin anfordert und dann mit writefile irgendetwas schreibt, sondern scanf, gets oder was auch immer verwendet.

    Irgendwie bringst Du jetzt schreiben und lesen durcheinander ...
    Auch das Beispielprogramm liest von STDINPUT, nur benutzt es dazu nicht scanf oder getline oder so ...
    Nimm einfach mal das von mir oben gepostete Testprogramm und versuche, das zu starten und an das zu schreiben und teste, ob es damit funktioniert, denn da kannst Du sicher sein, dass es auch von STDINPUT liest.
    Wenn das nicht klappt, machst Du iwas falsch. Wenn das klappt, bei Deinem gewünschten, fertigen Programm jedoch nicht, dann liest das wohl nicht so, wie Du es erwartest.



  • Du kannst das natürlich auch viel einfacher testen:

    echo 'was auch immer' | DeinLeseProgramm
    

    Dann siehst Du sofort, ob Dein Zielprogramm mit der Eingabe was anfängt, oder eben nicht ...


Log in to reply