Ausgabe während der Programmlaufzeit



  • Ich bin ein absoluter Anfänger in Sachen C und würde gerne wissen wie man es realisieren kann die Ausgabe in der Programmlaufzeit zu ermöglichen.
    Mit der printf() -Fkt habe ich es schon versucht, aber die gibt erst nach Beendigung des Progamms alles aus.
    Das gleiche Problem habe ich mit cout << "" << endl;


  • Mod

    Ausgaben sind alle während der Programmlaufzeit, eventuell kommen sie aber nicht beim Ausgabemedium an, da die Ausgabe nicht geflusht wird. Das kannst du in C mit fflush erreichen. Es gibt jedoch meistens einen guten Grund, wenn ein Ausgabemedium derart gepuffert ist, in der Regel Performance. Falls der Puffer noch eine Ebene höher sein sollte als die Anbindung deines Programms an den Ausgabestream, wirst du wohl (ohne spezielle Systemaufrufe) nichts ändern können.

    Das gleiche Problem habe ich mit cout << "" << endl;

    Das ist C++, eine von C verschiedene Sprache. In C++ flush jedoch der Manipulator endl (unter anderem) einen Stream, macht also das gleiche wie fflush. Wenn das nicht wirkt, wird auch fflush nichts erreichen.

    Kurz: Das liegt an deinem System.



  • Hier ist der benutzte Code:

    #include <iostream>
    using namespace std;
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    int main()
    {
    
     printf("helloWorld");
     fflush(stdin);
    
     system("PAUSE");
     return 0;
    }
    

    Es geht doch aber in jeder anderen Sprache, dass die Ausgabe korrekt erfolgt. 😕
    edit:
    ok, Problem gelöst^^
    fflush muss NULL als Parameter bekommen


  • Mod

    theotter92 schrieb:

    fflush(stdin);
    

    Nein, bitte nicht! Wo immer du das her hast: Nimm nie wieder von dort Ratschläge an! Wie kommst du denn auf stdin, wenn du die Ausgabe flushen willst*? Wenn du stdin flusht und irgendeinen Unsinn heraus bekommst, dann brauchst du dich nicht zu wundern.

    fflush muss NULL als Parameter bekommen

    Nein auch nicht! Wenn es mit 0 funktioniert, dann war irgendetwas ganz anders falsch.

    Wie wäre es damit, stdout zu flushen?

    *: Rhetorische Frage. Mir ist schon klar, dass du das (aus einer unbrauchbaren Quelle) abgeschrieben hast, aber hast du mal mitgedacht, was es bedeutet?



  • theotter92 schrieb:

    #include <iostream>
    using namespace std;
    

    Du bist hier im C-Forum. Das ist kein C.

    theotter92 schrieb:

    // ...
        fflush(stdin);
    

    fflush() ist für Eingabestreams undefiniert! Abgesehen davon: Warum sollte flushen der Standardeingabe irgendwas an deinem "Problem" mit der Ausgabe ändern?

    theotter92 schrieb:

    system("PAUSE");
    

    Schau bitte für bessere Alternativen in die FAQ!

    theotter92 schrieb:

    ok, Problem gelöst^^
    fflush muss NULL als Parameter bekommen

    Njet. fflush() will einen Pointer auf ein FILE . Auf einem NULL -Pointer wirds garnix machen. Rückgabewerte prüfen!?

    Lösung:
    fflush( stdout );



  • @swordfish:
    stdin hatte ich bei mir schon verändert, aber in dem geposteten Code vergessen.
    Mit stdout funzt es in jedem Fall auch.
    Woran es liegt, dass es mit NULL funzt kann ich lediglich mit der Quelle beantworten.
    Darin stand, dass die Übergabe von NULL alles flusht, ob das nun stimmt oder nicht, es hat funktioniert.



  • theotter92 schrieb:

    Darin stand, dass die Übergabe von NULL alles flusht, [...]

    Tatsächlich 😮

    ISO/IEC 9899:201x N1336 schrieb:

    § 7.19.5.2.3 If stream is a null pointer, the fflush function performs this flushing action on all streams for which the behavior is defined above.



  • 😮
    Und ich hab das gerade fuer MS-Spezifisches Zeug gehalten, was bei den Standard-Funktionen in der MSDN wieder nicht als solches gekennzeichnet wurde (zwei Saetze vorher steht ohne Kennzeichnung, dass stdin geleert wird, wenns geflusht wird 🙄 ). Aber das das so wirklich im Standard steht. 😮
    Tja man lernt nie aus. Trotzdem wuerde ich das vermeiden. Lieber explizit flushen und dann wissen, wann und wo welcher Stream geflusht wird, als sich darauf zu verlassen, dass man irgendwo mal alles flusht.



  • stdout ist zeilenweise gepuffert d.h. wenn eine Zeile zuende ist wird der Puffer geleert(flush)
    Zeilenende: Zeilenumbruch: '\n'
    oder bei c++'s cout das endl (" endl == '\n' ")



  • Woran machst du denn fest, dass die Ausgabe erst nach Programmende erfolgt? Nehmen wir folgenden Code (den du vermutlich im ersten Anlauf benutzt hast):

    #include <iostream>
    using namespace std;
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    int main()
    {
    
     printf("helloWorld");
    
     system("PAUSE");
     return 0;
    }
    

    Wenn du das Programm ausführst, sollte in etwa folgende Ausgabe kommen:

    helloWorldDrücken Sie eine beliebige Taste . . .

    Und dann wartet das Programm auf Eingabe. Im Anschluss beendet es sich. Ist es bei dir wirklich anders? Wenn ja, wie genau?


Anmelden zum Antworten