Standard Ausgabe und Escape Sequenz \n

Gast #3319205
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?
#3319278
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.
#3319291
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.
Gast #3319349
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.
*******************************************************************

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.