In a normal C program running on a modern OS, file access is buffered twice (or more when you count buffers like the buffer in your drive). One buffer is implemented in the FILE structure and the other is implemented in the kernel.

Often, the FILE structure buffers the content in a buffer inside of your program. When you write something to a buffered file, the content is keep in the buffer, inside of the running program. It is written to the OS when the buffer is full and, when the buffering mode is line buffered, at the end of a line. This data is written to the OS by a syscall, for example write(). The buffer is there because a syscall requires a context switch from the user program to the kernel, this is relatively expensive (slow), the buffer is here to reduce the number of syscalls. You could also use the syscalls from your program directly without the stdio functions, however, this functions are less portable and more complex to handle. A fflush(stdout) checks if there are any data in the buffer that should be written and if so, the underlying syscall is used to write the data to the OS.

When the syscall returns, the data is in your kernel. But modern operating systems buffer this data as well. This is used to reduce the number of disk writes, reduce latency and other things. This buffer is completely independent of the FILE buffer inside your program.

Note that this does not apply to all systems. For example microcontroller environments may provide some stdio.h functions that write directly to a UART, without any buffer, neither inside FILE nor any (probably non-existent) OS.

To see what fflush() does to a running program, compare this programs:

int main(void)
{
  fputs("s",stdout);
  fputs("e",stderr);
}

and

int main(void)
{
  fputs("s",stdout);
  fflush(stdout);
  fputs("e",stderr);
}

On Linux, stderr is not buffered by default, so fputs("e",stderr); will print the data immediately. On the other hand, fputs("s",stdout); is line buffered by default on Linux so the data is not printed immediately. This causes the first program to output es and not se, but the second one outputs se.

You can change the buffer modes with setvbuf()

Answer from 12431234123412341234123 on Stack Overflow
Top answer
1 of 2
10

In a normal C program running on a modern OS, file access is buffered twice (or more when you count buffers like the buffer in your drive). One buffer is implemented in the FILE structure and the other is implemented in the kernel.

Often, the FILE structure buffers the content in a buffer inside of your program. When you write something to a buffered file, the content is keep in the buffer, inside of the running program. It is written to the OS when the buffer is full and, when the buffering mode is line buffered, at the end of a line. This data is written to the OS by a syscall, for example write(). The buffer is there because a syscall requires a context switch from the user program to the kernel, this is relatively expensive (slow), the buffer is here to reduce the number of syscalls. You could also use the syscalls from your program directly without the stdio functions, however, this functions are less portable and more complex to handle. A fflush(stdout) checks if there are any data in the buffer that should be written and if so, the underlying syscall is used to write the data to the OS.

When the syscall returns, the data is in your kernel. But modern operating systems buffer this data as well. This is used to reduce the number of disk writes, reduce latency and other things. This buffer is completely independent of the FILE buffer inside your program.

Note that this does not apply to all systems. For example microcontroller environments may provide some stdio.h functions that write directly to a UART, without any buffer, neither inside FILE nor any (probably non-existent) OS.

To see what fflush() does to a running program, compare this programs:

int main(void)
{
  fputs("s",stdout);
  fputs("e",stderr);
}

and

int main(void)
{
  fputs("s",stdout);
  fflush(stdout);
  fputs("e",stderr);
}

On Linux, stderr is not buffered by default, so fputs("e",stderr); will print the data immediately. On the other hand, fputs("s",stdout); is line buffered by default on Linux so the data is not printed immediately. This causes the first program to output es and not se, but the second one outputs se.

You can change the buffer modes with setvbuf()

2 of 2
5

When stdout points to a tty, it is, by default, line-buffered. This means the output is buffered inside the computer internals until a full line is received (and output).

Your programs do not send a full line to the computer internals.

In the case of using fflush() you are telling the computer internals to send the current data in the buffer to the device; without fflush() you are relying on the computer internals to do that for you at program termination.

By computer internals I mean the combination of the C library, Operating System, hardware interface, (automatic) buffers between the various interfaces, ...

🌐
TutorialsPoint
tutorialspoint.com › c_standard_library › c_function_fflush.htm
C Library - fflush() function
The C library fflush() function flushes the output buffer of a stream.This function forces a write of all buffered data for the given output or update stream to the file. When applied to an input stream, its behavior is undefined.
Discussions

when to fflush stdout?
The C Standard is delightfully vague on when a stream's buffer is automatically flushed, or "transmitted to the host environment" as it calls it. First, you need to consider whether the output stream is unbuffered, fully buffered or line buffered: When a stream is unbuffered, characters written to it are intended to be transmitted as soon as possible. When a stream is fully buffered, characters written to its buffer are intended to be transmitted as a block when that buffer is full. When a stream is line buffered, characters written to its buffer are intended to be transmitted as a block when a newline is written. It also says that the buffer is intended to be transmitted as a block when it is full. This can happen even on a line buffered stream, if you don't write a \n for a long time. There are several weasel words throughout all this, things like "intended to be" and "as soon as possible". Put simply, the C Standard says that what happens is pretty much implementation-defined, but it'd be kind of nice if the implementation worked this way. So, if your stdout is unbuffered, or if your stdout is line buffered and you are on an implementation that reliably performs an automatic flush whenever you write \n to it (to be honest, you probably will be), then you do not need to do anything extra. Note that the initial buffering mode for stdout is not fully specified by the C Standard. It requires stdout to be fully buffered if and only if the implementation can determine it is not connected to an interactive device. This means that if it is connected to an interactive device it could be unbuffered or line buffered. Luckily for you, however, they should have the same behaviour when you write \n. More on reddit.com
🌐 r/C_Programming
6
1
February 3, 2021
operating system - What does fflush(stdin) do in C programing? - Stack Overflow
Adding an fflush(stdout) after the printf() solves the problem: ... Now, working by analogy, people often think that fflush(stdin) should discard any unused input, but if you think about it a little bit that doesn't make much sense. What does it mean to “flush” an input buffer? More on stackoverflow.com
🌐 stackoverflow.com
c - Why would I need use fflush on stdout before writing to stderr? - Stack Overflow
I don't understand why fflush is used on stdout on the first line and why the comment explains the reason for its use. ... This is because of buffering. Stdout and stderr are usually buffered differently. Stdout is usually line buffered, meaning it will not display output until it sees a newline. More on stackoverflow.com
🌐 stackoverflow.com
What is fflush(stdout) doing in this str - C++ Forum
The 80 is the size of the array, ... doesn't overflow the bounds of the array. As far as the fflush() goes it is really not needed in normal operation, the scanf() call will normally cause a flush of the stdout stream.... More on cplusplus.com
🌐 cplusplus.com
🌐
Quora
quora.com › What-does-fflush-stdout-do-in-C-and-how-do-you-use-it
What does fflush (stdout) do in C, and how do you use it? - Quora
Answer (1 of 3): Personally, I only find any use in calling fflush(stdout) after making a call to something like “setvbuf(stdout, NULL, _IOFBF, size)”. To understand fflush, you must first understand that when you do write operations (that print to the console, in the case of stdout), what actua...
🌐
Educative
educative.io › answers › what-is-fflush-in-c
What is fflush in C?
The fflush function in C is used to immediately flush out the contents of an output stream. This is particularly useful in displaying output, as the operating system may initially put the output data in a temporary buffer before writing it to ...
🌐
GeeksforGeeks
geeksforgeeks.org › c language › use-fflushstdin-c
Use of fflush(stdin) in C - GeeksforGeeks
September 15, 2023 - fflush() is typically used for output stream only. Its purpose is to clear (or flush) the output buffer and move the buffered data to console (in case of stdout) or disk (in case of file output stream).
🌐
Cprogramming
cboard.cprogramming.com › c-programming › 61997-when-where-use-fflush-stdout.html
When and where to use fflush (stdout)?
If the line of text does not end in a \n, there is no guarantee that any of the text will appear on the screen. fflush() moves everything that is "pending" onto the screen. fflush(stdout) means write all of the buffered data to it's destination - whatever stdout is.
🌐
Reddit
reddit.com › r/c_programming › when to fflush stdout?
r/C_Programming on Reddit: when to fflush stdout?
February 3, 2021 -

I'M under openwrt.

call vfprintf(stdout, buf, ap) or vprintf
buf endwith "\n"
do i need to fflush it?

Top answer
1 of 2
3
The C Standard is delightfully vague on when a stream's buffer is automatically flushed, or "transmitted to the host environment" as it calls it. First, you need to consider whether the output stream is unbuffered, fully buffered or line buffered: When a stream is unbuffered, characters written to it are intended to be transmitted as soon as possible. When a stream is fully buffered, characters written to its buffer are intended to be transmitted as a block when that buffer is full. When a stream is line buffered, characters written to its buffer are intended to be transmitted as a block when a newline is written. It also says that the buffer is intended to be transmitted as a block when it is full. This can happen even on a line buffered stream, if you don't write a \n for a long time. There are several weasel words throughout all this, things like "intended to be" and "as soon as possible". Put simply, the C Standard says that what happens is pretty much implementation-defined, but it'd be kind of nice if the implementation worked this way. So, if your stdout is unbuffered, or if your stdout is line buffered and you are on an implementation that reliably performs an automatic flush whenever you write \n to it (to be honest, you probably will be), then you do not need to do anything extra. Note that the initial buffering mode for stdout is not fully specified by the C Standard. It requires stdout to be fully buffered if and only if the implementation can determine it is not connected to an interactive device. This means that if it is connected to an interactive device it could be unbuffered or line buffered. Luckily for you, however, they should have the same behaviour when you write \n.
2 of 2
1
Related thing, concerning line buffered FILEs: printf("yes "); /* no newline */ getchar(); The prompt gets out without a fflush, at least here, because input from a line/non-buffered stream forces fflush on ALL line buffered output streams automatically. ?! There's a comment in FreeBSD stdio sources: /* * Before reading from a line buffered or unbuffered file, * flush all line buffered output files, per the ANSI C * standard. */
Find elsewhere
🌐
Quora
quora.com › Why-do-we-use-the-functions-fflush-stdin-and-fflush-stdout-in-c
Why do we use the functions fflush(stdin) and fflush(stdout) in c? - Quora
Answer (1 of 6): Let us first understand the different I/O functions that the standard library provides and their relationship to each other. Output For formatted output, you have fprintf / printf / and their variants. For string output, you have fputs. For output of uninterpreted data i.e. raw ...
🌐
Programiz
programiz.com › cpp-programming › library-function › cstdio › fflush
C++ fflush() - C++ Standard Library
If stream is an output stream or update stream whose last operation was output, calling the fflush() function will write any buffered unwritten data to the associated output device. If stream is a null pointer, all open output streams are flushed. The behaviour is undefined for input streams ...
Top answer
1 of 2
47

The answer to this is that fflush(stream) is only formally defined for output streams, so fflush(stdout) is OK, but fflush(stdin) is not.

The purpose of fflush(stream) is to make the operating system flush any buffers to the underlying file. For an example of a legitimate use, students often have problems like “my prompt doesn't appear!” if they do something like:

printf("Enter a number: ");

However, they find that this works just fine:

printf("Enter a number:\n");

Of course, they don't want a newline after their prompt, so they have a bit of a problem.

The reason for this is that the output to stdout is buffered by the OS and the default behavior is (often) only to actually write the output to the terminal when a newline is encountered. Adding an fflush(stdout) after the printf() solves the problem:

printf("Enter a number: ");
fflush(stdout);

Now, working by analogy, people often think that fflush(stdin) should discard any unused input, but if you think about it a little bit that doesn't make much sense. What does it mean to “flush” an input buffer? Where is it “flushed” to? If you flush an output buffer, the output is sent to the underlying file or the terminal, where it would eventually wind up anyway, but where would input “eventually end up anyway”? There's no way of knowing! What should the behavior be if the input stream data comes from a file or a pipe or a socket? It isn't at all clear for input streams what the behavior of fflush() should be, but it's very clear for output streams in all cases. Hence, fflush() is only defined for output streams.

The reason why the erroneous use of fflush(stdin) became commonplace is that, many years ago, a few operating systems did implement a scheme where it worked as many people expected, discarding unused input. Microsoft DOS is a good example. Surprisingly, modern versions of Linux also implement fflush() for input streams.

The right thing to do with “extra” unwanted terminal input is simply to read it and do nothing with it. This is almost as easy as calling fflush(stdin), works everywhere, and doesn't rely on formally undefined behavior.

The C standard says:

If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.

POSIX says (also explicitly defers to C standard):

If stream points to an output stream or an update stream in which the most recent operation was not input, fflush() shall cause any unwritten data for that stream to be written to the file, ...

But the Linux manpage says:

For output streams, fflush() forces a write of all user-space buffered data for the given output or update stream via the stream's underlying write function. For input streams, fflush() discards any buffered data that has been fetched from the underlying file, but has not been consumed by the application. The open status of the stream is unaffected.

2 of 2
20

fflush(stdin) invokes undefined behaviour.

fflush() is defined only for output streams. You should not do it.


On Unix, Ctrl-Z sends a TSTP signal (SIGTSTP) which by default causes the process to suspend execution.

🌐
Scaler
scaler.com › home › topics › fflush() in c
fflush() in C - Scaler Topics
May 4, 2023 - The best example of File Object is stdout, stderr, etc. The return type of the fflush() function in C is zero if the function call is successful which means the buffer is flushed and if it is unsuccessful then it will return an error that is End of File or eof in form of a positive integer and an indicator is set to indicate feof.
Top answer
1 of 2
26

This is because of buffering. Stdout and stderr are usually buffered differently. Stdout is usually line buffered, meaning it will not display output until it sees a newline. Stderr is usually unbuffered and will print immediately, the thinking is you should see error messages pronto.

But they both go to the same place, the terminal. This is what it means by /* in case stdout and stderr are the same */. They usually are. But because they're buffered differently this can lead to them being displayed out of order.

Consider this code. Note the lack of a newlines.

#include <stdio.h>

int main() {
    fprintf(stdout, "This is to stdout. ");
    fprintf(stderr, "This is to stderr. ");
    fprintf(stdout, "This is also to stdout. ");
}

You'd expect the output to be:

This is to stdout. This is to stderr. This is also to stdout.

But it isn't. It's out of order.

$ ./test
This is to stderr. This is to stdout. This is also to stdout.

The output to stderr is displayed immediately, it is unbuffered. While stdout has to wait until the stdout buffer is flushed by a newline. There is no newline, so it is flushed when the program exits.

By flushing stdout before you use stderr you ensure that the output comes in the right order regardless of buffering.

#include <stdio.h>
#include <unistd.h>

int main() {
    fprintf(stdout, "This is to stdout. ");
    fflush(stdout);
    fprintf(stderr, "This is to stderr. ");
    fprintf(stdout, "This is also to stdout. ");
}

$ ./test
This is to stdout. This is to stderr. This is also to stdout. 

This ensures that error messages come out in the right order along with normal messages. This avoids confusion about what error message applies to what part of the program.

2 of 2
2

If stdout and stderr point to the same file, you have to be sure that whatever is in the stdout buffer is written first.

🌐
Linux Hint
linuxhint.com › fflush-function-c-programming
How to use fflush function in C programming – Linux Hint
The fflush() function is the abbreviation of the “flush file buffer”, as it is clear from its name that its function is to clear some content. In C programming, it is used to clear the buffer so that the output stream(stdout) can display the output.
Top answer
1 of 6
1
>>When and why we need to use fflush exactly? Depends on the operating system. When writing to the screen (MS-Windows) I never use fflush() because MS-Windows seems to write immediately. I have seen the problem on *nix computers where it was necessary even after putting '\n' in the output stream. · When to do it? You won't have to put it after every printf() statement, you can delay callinf fflush() until after all printf() statements but before any input statements. Lets say you want to display a menu that has 10 printf() statements. Just put the fflush() after the last printf(). · For disk file streams call fflush() after all writing has been done. Its not necessary to call fflush() before the file is closed because fclose() will do that anyway.
2 of 6
1
in the ... link they are saying, user should definitely NOT [use fflush(stdout) to clear the output buffer.] · that webpage is a joke. a bad joke. they actually instruct you to use gets() as an example of "safe code". this right there tells me they're talking out their ass. · for example here jephthah gave a solution where he used fflush after printf and mentioned // printf did not have newline, need to flush · if you don't print a newline, but want the line to display to the terminal, you should use fflush(stdout);. Your system may not need this, but some systems will not print text to the output buffer until a newline is found or the buffer is otherwise flushed. · Narue has explained it better than i can. i'm only commenting here because my name was dropped :icon_wink:
🌐
Linux Man Pages
man7.org › linux › man-pages › man3 › fflush.3.html
fflush(3) - Linux manual page
For output streams, fflush() forces a write of all user-space buffered data for the given output or update stream via the stream's underlying write function.
🌐
Linux Man Pages
man7.org › linux › man-pages › man3 › fflush.3p.html
fflush(3p) - Linux manual page
If stream points to an output stream or an update stream in which the most recent operation was not input, fflush() shall cause any unwritten data for that stream to be written to the file, and the last data modification and last file status change timestamps of the underlying file shall be ...
🌐
Cplusplus
cplusplus.com › forum › beginner › 252034
What is fflush(stdout) doing in this str - C++ Forum
The 80 is the size of the array, the value used in the scanf() call should be one less than the size of the array. This is to insure that scanf() doesn't overflow the bounds of the array. As far as the fflush() goes it is really not needed in normal operation, the scanf() call will normally cause a flush of the stdout stream.
🌐
George Washington University
www2.seas.gwu.edu › ~simhaweb › C › modules › appendix › misc › misc.html
Using fflush() to force output
fflush() forces the output to be written from whatever buffer is being used by its argument. The argument is a file. In C, the screen is treated like a file - it has the special name stdout.
🌐
C For Dummies
c-for-dummies.com › blog
Un-Buffering Output | C For Dummies Blog
July 20, 2019 - In C, you can flush any output stream. The effect is that any data waiting in the buffer is rushed out the door. This effect applies to open files as well as the stdout and stderr devices. The function is called fflush() and it’s defined in the stdio.h header file.