Forum: Compiler & IDEs Standard Ausgabe und Escape Sequenz \n


von Patricia (Gast)


Lesenswert?

Gibt es irgendeine Regelung in der Programmiersprache C, die besagt, 
dass man bei einer Ausgabe (stdout) die Escape Sequenz \n erst am Ende 
der Zeile schreiben muss?

Eine generelle Frage noch: Wie wird eigentlich der stdout gepuffert? 
Sprich wann wird der Puffer ausgegeben?
Zum Beispiel wenn der Befehl

printf("Hallo Welt\n");

steht, was passiert wie?

von Karl H. (kbuchegg)


Lesenswert?

Patricia schrieb:
> Gibt es irgendeine Regelung in der Programmiersprache C, die besagt,
> dass man bei einer Ausgabe (stdout) die Escape Sequenz \n erst am Ende
> der Zeile schreiben muss?

Es gibt nur eine Regelung:
Wenn die stdout gepuffert ist, UND ein \n ausgegeben wird, DANN muss 
dieser Puffer vom I/O System geleert werden.

Ansonsten: Du kannst ausgeben, was und in welcher Reihenfolge du auch 
immer willst.

> Eine generelle Frage noch: Wie wird eigentlich der stdout gepuffert?

Das entscheidet dein I/O System.
C an sich interessiert sich nicht dafür

> Sprich wann wird der Puffer ausgegeben?

Wann immer das I/O System das als richtig erachtet. Die einzige 
Forderung, die C erhebt ist: bei einem \n sind eventuell gepufferte 
Zeichen tatsächlich auszugeben.

von Karl H. (kbuchegg)


Lesenswert?

Das ich nicht lüge.
In meinem Hinterkopf schwirrt da noch so ein Gedanke rum, der eine 
Verknüpfung zwischen stdout und stdin postuliert. D.h. der Buffer wird 
auch dann ausgegeben, wenn eine Einlesenoperation über stdin gestartet 
wird.

So eine Verknüpfung ist natürlich sinnvoll, aber ich bin mir nicht 100% 
sicher, ob das vom C-Standard tatsächlich gefordert wird oder nicht.

von Rolf Magnus (Gast)


Lesenswert?

Patricia schrieb:
> Gibt es irgendeine Regelung in der Programmiersprache C, die besagt,
> dass man bei einer Ausgabe (stdout) die Escape Sequenz \n erst am Ende
> der Zeile schreiben muss?

Das ist etwas merkwürdig formuliert, denn es ist eher umgekehrt. Wenn du 
irgendwo \n schreibst, wird das automatisch als Zeilenende 
interpretiert. Damit ergibt sich von selbst, daß \n erst am Ende der 
Zeile ist. Wenn danach noch was kommt, steht das halt in der nächsten 
Zeile.

Karl Heinz Buchegger schrieb:
> Es gibt nur eine Regelung:
> Wenn die stdout gepuffert ist, UND ein \n ausgegeben wird, DANN muss
> dieser Puffer vom I/O System geleert werden.

Aber auch nur, wenn es "line buffered" ist.

Karl Heinz Buchegger schrieb:
>> Eine generelle Frage noch: Wie wird eigentlich der stdout gepuffert?
>
> Das entscheidet dein I/O System.
> C an sich interessiert sich nicht dafür

Das stimmt nicht ganz. Es gibt sogar eine Standard-Funktion um das 
Buffering umzustellen, auch wenn das nicht zwingend von jeder Plattform 
untestützt werden muss. Hier mal ein Auszug aus C99:

*******************************************************************
When a stream is unbuffered, characters are intended to appear from the 
source or at the destination as soon as possible. Otherwise characters 
may be accumulated and transmitted to or from the host environment as a 
block. When a stream is fully buffered, characters are intended to be 
transmitted to or from the host environment as a block when a buffer is 
filled. When a stream is line buffered, characters are intended to be 
transmitted to or from the host environment as a block when a new-line 
character is
encountered. Furthermore, characters are intended to be transmitted as a 
block to the host environment when a buffer is filled, when input is 
requested on an unbuffered stream, or when input is requested on a line 
buffered stream that requires the transmission of characters from the 
host environment. Support for these characteristics is 
implementation-defined, and may be affected via the setbuf and setvbuf 
functions.
*******************************************************************

von Karl H. (kbuchegg)


Lesenswert?

Ja, genau. setbuf

Danke für die Auffrischung meines Gedächtnisses.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.