Ausgabe in C



  • Servus,

    habe folgendes Problem : Die Textausgabe des Programms erfolgt immer erst nach Abschluss der Funktion. Das ist etwas blöd, weil davor Eingaben von Zahlen erfolgen.

    Hier mal ein ganz simples Beispiel :

    #include<stdio.h>
    
    int main(a, b, sum) {
    
    	printf("Mit diesem Programm können Sie zwei ganze Zahlen a und b addieren.\n");
    	printf("Geben Sie a ein\n");
    	scanf("%d", &a);
    	printf("a = %d\n", a);
    	printf("Geben Sie b ein\n");
    	scanf("%d", &b);
    	printf("b = %d\n", b);
    	sum = a+b;
    	printf("a + b = %d", sum);
    	return 0;
    }
    

    In dem Beispiel hätte ich es gerne so, dass direkt nach Starten des Programms schon die ersten beiden Textmeldungen erscheinen, dann auf Aufforderung a bzw. b eingegeben werden müssen und nach der Eingabe von b dann "b = _" und "a + b = _" erscheint. Stattdessen werden a und b ins leere eingegeben und dann folgt der gesamte Ausgabetest. Jemand eine Idee wie man das Problem löst?

    Das gesamte Programm ist komplizierter und länger, da erspare ich euch den Code. Mir geht es erstmal darum, wie man es generell (anhand des einfachen Beispiels) löst, den dann kann ich es auf das gesamte Programm übertragen.

    Gruss Rainer



  • Das beschriebene Problem tritt bei diesem Programm nicht auf, da hast du wohl zuviel weggeschnitten.



  • Von dem Problem habe ich schon mal im Zusammenhang mit Eclipse gelesen.
    Also bei der Ausführung des Programms aus Eclipse heraus.
    Die Shell hat da wohl ein Problem.



  • Das kann natürlich sein. Meines Wissens flusht printf nur, wenn die Standardausgabe ein (interaktives) Terminal ist.



  • fflush(stdout);
    


  • Danke schon mal für die Antworten.

    Also.. ich habe mein Test-Programm selber noch mal ausprobiert. Der Fehler tritt weiterhin auf.

    fflush(stdout);
    

    hat da leider auch nicht geholfen (ich habe es an den Anfang der Mein-Funktion gesetzt).

    Ich benutze nicht Eclipse, sondern CygWin. Wenn ich das Programm mit genau den von mir gepostetem Code ausführe, sieht das so aus :
    http://s7.directupload.net/images/131108/kh3hl56l.png

    Dabei habe ich zuerst die beiden Zahlen eingeben müssen, und erst danach den Text gesehen.



  • Sorry, Link funktioniert nicht.

    Hier der richtige :
    http://s7.directupload.net/images/131108/kh3hl56l.png



  • Mann, doch nicht am Beginn des Programms, sondern dort, wo du die Ausgabe sicherstellen willst, also vor (jedem) scanf.


  • Mod

    Bashar schrieb:

    Das kann natürlich sein. Meines Wissens flusht printf nur, wenn die Standardausgabe ein (interaktives) Terminal ist.

    Das sollte Aufgabe des Terminals sein. printf weiß nichts davon, wo seine Ausgabe hingeht. Die meisten interaktiven Terminals (zumindest unter Linux) flushen automatisch bei jedem Zeilenumbruch. Das Eclipseterminal anscheinend nicht.



  • Wutz schrieb:

    Mann, doch nicht am Beginn des Programms, sondern dort, wo du die Ausgabe sicherstellen willst, also vor (jedem) scanf.

    Danke, daran hat es gelegen. Hab das inzwischen vor alle scanf im großem Programm gesetzt und nun ist alles richtig.



  • Das ist aber ein Problem von deiner Umgebung.

    Normalerweise ist das nicht nötig.



  • SeppJ schrieb:

    Bashar schrieb:

    Das kann natürlich sein. Meines Wissens flusht printf nur, wenn die Standardausgabe ein (interaktives) Terminal ist.

    Das sollte Aufgabe des Terminals sein. printf weiß nichts davon, wo seine Ausgabe hingeht. Die meisten interaktiven Terminals (zumindest unter Linux) flushen automatisch bei jedem Zeilenumbruch. Das Eclipseterminal anscheinend nicht.

    Das siehst du falsch. Das Terminal weiß nicht, wann was geflusht wird. Das Terminal geht es nichtmal etwas an, ob du printf benutzt, gepuffert oder ungepuffert, oder ob du deine Ausgaben vielleicht direkt über den Systemaufruf machst. Umgekehrt weiß die stdio (über sowas wie isatty()), ob stdout an einem interaktiven Terminal hängt und kann dementsprechend den Pufferungsmodus umschalten.


  • Mod

    Jedenfalls erfolgt es nicht auf printf-Ebene. Ich habe mal nachgeschlagen, dieses Verhalten ist POSIX-Standard (in C99 übernommen) für die Ausgabestreams. Die Funktionen, die auf diesen arbeiten, bekommen davon nichts mit.


Log in to reply