You would use fflush(stdout) to ensure that whatever you just wrote in a file/the console is indeed written out on disk/the console.
The reason is that actually writing, whether to disk, to the terminal, or pretty much anywhere else, is pretty slow. Further, writing 1 byte takes roughly the same time as writing, say, a few hundred bytes[1]. Because of this, data you write to a stream is actually stored in a buffer which is flushed when it is full or when you call fflush. Calling fflush means you are accepting that your function call will take a bit of time but that you are 100% sure that you want this out right away.
As for fflush(stdin), the reason people call it is that some functions, scanf in particular, sometimes leave the input in a counter-intuitive state.
For instance, say you call scanf("%d", &n) and then fgets(buf, 100, stdin), expecting an input of the form:
10
line
Well it turns out that what you will get is an empty line on the fgets because scanf didn't move you past the '\n' after it read the 10.
Because of that kind of problem, people use fflush(stdin). This is because at the time you call it, the '\n' following "10" is in the buffer but not the string "line\n". THIS IS A TERRIBLE IDEA. IT ONLY WORKS ON WINDOWS.
In it is explicitly said in the standard that fflush should only apply to output streams. This is because things that just don't make sense would happen if you used it out input streams.
See, there is absolutely nothing that indicates that "line\n" will not be in the buffer at that time. Sure it works when writing input manually, but this might fail if the user is copying and pasting into your program, and is even less likely to work if someone redirects a file as input to your program. Heck, even just a fast typer, a slow computer and a bit of luck might mess this up...
Because of this it seems, the implementation on my Mac simply ignores fflush(stdin). I don't know what happens on other platforms but I'm sure there's at least one that has the behavior I described earlier where you might just lose some of your input because of an fflush. Point is, don't use it on input streams.