I am aware that most terminals are by default in line buffer mode. i.e. output is buffered and not directed to stdout until a new-line character is encountered.
So I would expect this to print nothing (at least before the buffer is filled up):
int main() {
while(1) {
printf("Haha");
sleep(1);
}
return 0;
}
It indeed prints nothing for a short period of time.
If I want to print "Haha" every second, I can either printf("Haha\n")
or do fflush(stdout)
after printf. (I know this is not so portable, but it's a solution nonetheless)
Now I recall the very classic scanf program (with my addition to while(1) loop to prevent buffer flushing on program exit):
int main() {
char char_in;
while(1) {
printf("Haha. Input sth here: ");
scanf("%c", &char_in);
}
return 0;
}
Now the program prints Haha. Input sth here:
(and wait for my input). It is not here if I remove the scanf statement. Why is that so?
Thanks.
The printf statement does not automatically append a newline to its output. It outputs only what the format string specifies. So if a newline is needed, you must include one in the format string.
There is no buffering (i.e. each character is output immediately). The stderr stream is _IONBF by default.
Doing printf("Hello "); sleep(1); scanf("%c", &things); shows for me that indeed, with an interactive program scanf flushes stdout buffer.
To clarify the title of the question: printf(..) does not do any flushing itself, it's the buffering of stdout that may flush when seeing a newline (if it's line-buffered).
Now the program prints
Haha. Input sth here:
(and wait for my input). It is not here if I remove the scanf statement. Why is that so?
Because the standard (N1570 .. "almost C11") says so, §5.1.2.3/6 (emphasis mine):
The least requirements on a conforming implementation are:
[..]
- The input and output dynamics of interactive devices shall take place as specified in 7.21.3. The intent of these requirements is that unbuffered or line-buffered output appear as soon as possible, to ensure that prompting messages actually appear prior to a program waiting for input.
[..]
Even though your output does not contain a newline and is send to a line buffered stdout
, it has to appear before your program is allowed to wait for input. This is because stdout
and stdin
are connected to a terminal and thus are (Attention: This is implementation defined!) what the standard calls "interactive devices".
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With