tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von sheel
  • 1 Beitrag von MCoder
ERLEDIGT
JA
ANTWORTEN
12
ZUGRIFFE
447
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Hallo Welt

    Wie der Titel schon sagt, möchte ich die Ausgabe einer Konsolenanwendung auslesen, dies per Umleitung der Ausgabe durch die cmd.exe.
    Mein Problem ist jetzt, dass die Datei zwar erstellt wird, ich sie aber nicht in Echtzeit auslesen kann, sprich der FILE* der cmd.exe nicht geschlossen wird. Einzig am Schluss der Ausführung bin ich in der Lage, den Inhalt einzusehen. Wisst ihr eine ähnlich einfache Alternative oder wie man das Problem beheben kann?

    Gruss
    cwriter
     
    Intel inside - Idiot outside :-)

    Ich schreibe in C und bin Anfänger.
    ______________________________

    Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
    Danke

  2. #2
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin,

    sorry, aber meine Glaskugel ist zur Reparatur .....

    Du solltest mal Deinen Code posten !

    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  3. #3
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Code c:
    1
    
    system("Test.exe >> Test.txt");
    Die Test.exe ist eine Win32-Konsolenapplikations und gibt Text aus, dem ich gerne mit einem WinApi einen schöneren Anstrich verpassen will. Soll heissen:
    Code c:
    1
    
    system("Test.exe >> Test.txt");
    Programm ist im Leerlauf.
    Doppelklick auf Test.txt gibt ein leeres Editorfenster.
    In laufende Konsole "quit" (Befehl zum Beenden der Test.exe) eingeben.
    Doppelklick auf Test.txt zeigt die erwünschte stdout.
    -------------------------------------------------------------------------
    Meine Deutung:
    cmd.exe schreibt öffnet FILE* auf Test.txt, schliesst ihn aber nicht fortlaufend und öffnet ihn im "a"-Mode wieder, sondern schliesst FILE* erst beim Beenden wieder.


    Gruss

    cwriter
     
    Intel inside - Idiot outside :-)

    Ich schreibe in C und bin Anfänger.
    ______________________________

    Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
    Danke

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    das ist normal.
    Ab einer gewissen Menge wird vermutlich was reingeschrieben, um RAM zu sparen, aber eben immer nur blockweise.

    Nur mit CMD-Mitteln kannst du da nichts machen.
    Du müsstest das Programm selber so umändern, dass du ihm beim Start einen Dateinamen mitgibst (argc/argv) und das Programm dann selber immer wieder öffnen/schreiben/schließen lassen.

    Gruß
     

  5. #5
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Hi
    Gibt es noch eine andere Möglichkeit als das Programm zu verändern? Beispielsweise ein externes Programm, das die .exe aufruft und danach die STDOUT "hijackt"? Ich habe da mal was von pipes gelesen, werde aber daraus nicht so recht schlau. Gibt es eine Alternative zu den Pipes?

    Gruss
    cwriter
     
    Intel inside - Idiot outside :-)

    Ich schreibe in C und bin Anfänger.
    ______________________________

    Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
    Danke

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Pipes wären allerdings wirklich eine Möglichkeit.
    Alternative fällt mir dazu aber keine ein.

    Was ist denn das Problem mit den Pipes?
    Ist vergleichbar mit einer Datei, fopen usw.
    Nur ist das, was reingelesen wird, kein Dateiinhalt, sondern die Ausgabe eines anderes Konsolenprogramms.

    Im externen Programm
    -Das erste Programm mit popen oder so öffnen
    -Eine Zeile einlesen, Datei auf, reinschreiben, Datei zu
    -Nächste Zeile...
    -Bis das erste Programm fertig ist, dann auch das zweite beenden

    Gruß
     

  7. #7
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Erstmal danke für deine Mühe, sheel

    Mein Problem mit Pipes ist dies am Ende von http://msdn.microsoft.com/en-us/libr...v=vs.60).aspx:
    Code :
    1
    
    Note   The _popen function returns an invalid file handle, if used in a Windows program, that will cause the program to hang indefinitely. _popen works properly in a Console application. To create a Windows application that redirects input and output, read the section "Creating a Child Process with Redirected Input and Output" in the Win32 SDK.

    Ich erstelle jeweils die win32-Konsolenanwendungen. Funktioniert das denn so?

    Gruss
    cwriter
     
    Intel inside - Idiot outside :-)

    Ich schreibe in C und bin Anfänger.
    ______________________________

    Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
    Danke

  8. #8
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Ja, das Funktioniert.

    "Windows"-Program ist etwas undeutlich, da ja nicht nur ein grafisches Programmfenster, sondern auch das Betriebssystem gemeint sein kann.
    Hier ist aber die Rede von einem grafischen Fenster.

    popen funktioniert nur mit dem, was aus printf und ähnlichem herauskommt.
    Keine Buttons, Messageboxen etc. auf dem Bildschirm.

    Gruß
    cwriter bedankt sich. 

  9. #9
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Hallo
    Erstmal danke für deine erstklassige Hilfe!
    Ich habe dennoch das gleiche Problem wie mit der system() Variante.
    Ich habe mal den Code der msdn geklaut:
    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void main( void )
    {
     
       char   psBuffer[128];
       FILE   *f;
     
            /* Run DIR so that it writes its output to a pipe. Open this
        * pipe with read text attribute so that we can read it
             * like a text file.
        */
       if( (f = _popen( "MUD.exe", "rt" )) == NULL )
          exit( 1 );
     
       /* Read pipe until end of file. End of file indicates that
        * f closed its standard out (probably meaning it
             * terminated).
        */
        while(!feof(f))
        {
          if( fgets( psBuffer, 128, f ) != NULL )
             printf( psBuffer );
        }
       /* Close pipe and print return value of f. */
       printf( "\nProcess returned %d\n", _pclose( f ) );
       system("PAUSE");
    }
    Es funktioniert auch erst durch beenden! Ich verzweifle langsam echt! Siehst du hier eine Möglichkeit, STDOUT in Echtzeit auszugeben?

    Gruss
    cwriter
     
    Intel inside - Idiot outside :-)

    Ich schreibe in C und bin Anfänger.
    ______________________________

    Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
    Danke

  10. #10
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Hallo,

    Dein Problem liegt an der Architektur von gepufferten Streams. Diese werden nicht nach jedem Zeichen geschrieben, sonder immer erst nach einer bestimmten Menge an Daten im Schreibpuffer. Oder wenn man manuell flushed, was aber voraussetzt das man das Programm welches die Ausgabe erzeugt verändern kann.
     

  11. #11
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Kann man das nicht einfach "overloaden", um an den Inhalt zu kommen?

    cwriter
     
    Intel inside - Idiot outside :-)

    Ich schreibe in C und bin Anfänger.
    ______________________________

    Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
    Danke

  12. #12
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo cwriter,

    evt. ist dieser Link was für dich: http://www.codeproject.com/KB/thread...reConsole.aspx

    Ich hatte vor Jahren mal sowas gemacht und kann mich erinnern, dass Redirect der Ausgabe von DOS-Kommandos bzw. -programmen etwas, naja haklig ist

    Gruß
    MCoder
    cwriter bedankt sich. 
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  13. #13
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Ein ganz dickes DANKE an MCoder!
    Für diejenigen, die dasselbe Problem haben: http://www.codeproject.com/KB/threads/RTconsole.aspx
    Dann die .zip-Datei runterladen. In der cmd.exe / system() zur Speicherung in einer Datei:
    Code :
    1
    
     RTconsole.exe Test.exe >> Datei.txt
    und sonst CreateProcess(L"\"RTconsole.exe\" \"Test.exe\"",...) und dann wie gewohnt pipen.


    Vielen Dank an alle, die mir geholfen haben

    cwriter
     
    Intel inside - Idiot outside :-)

    Ich schreibe in C und bin Anfänger.
    ______________________________

    Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
    Danke

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 21.08.10, 14:30
  2. echo "$test" nicht umwandeln... ?
    Von Templorials im Forum PHP
    Antworten: 3
    Letzter Beitrag: 27.03.08, 14:04
  3. "class test extends db" funktioniert nicht
    Von schleckerbeck im Forum PHP
    Antworten: 13
    Letzter Beitrag: 09.11.07, 13:22
  4. <xsl:when test=""> auf ein bestimmtes child klappt nicht
    Von tiefenwechsel im Forum XML Technologien
    Antworten: 2
    Letzter Beitrag: 09.10.07, 17:07
  5. "System Failed CPU Test"
    Von rebbi im Forum Hardware
    Antworten: 1
    Letzter Beitrag: 09.12.04, 00:14