Why does printf not flush after the call unless a newline is in the format string?

The stdout stream is line buffered by default, so will only display what’s in the buffer after it reaches a newline (or when it’s told to). You have a few options to print immediately:

  • Print to stderrinstead using fprintf (stderr is unbuffered by default):

    fprintf(stderr, "I will be printed immediately");
    
  • Flush stdout whenever you need it to using fflush:

    printf("Buffered, will be flushed");
    fflush(stdout); // Will now print everything in the stdout buffer
    
  • Disable buffering on stdout by using setbuf:

    setbuf(stdout, NULL);
    
  • Or use the more flexible setvbuf:

    setvbuf(stdout, NULL, _IONBF, 0); 
    

Leave a Comment