小编典典

为什么 printf 在调用后不刷新,除非换行符在格式字符串中?

all

printf除非换行符在格式字符串中,否则为什么在调用后不刷新?这是 POSIX 行为吗?我怎么可能printf每次都立即冲水?


阅读 154

收藏
2022-03-04

共1个答案

小编典典

默认情况下stdout,流是行缓冲的,因此只会在到达换行符后(或被告知时)显示缓冲区中的内容。您有几个选项可以立即打印:

  • 使用打印stderr代替fprintf(默认情况下stderr无缓冲的):

    fprintf(stderr, "I will be printed immediately");
    
  • 需要时冲洗stdout以使用fflush

    printf("Buffered, will be flushed");
    

    fflush(stdout); // Will now print everything in the stdout buffer

  • 使用以下命令禁用标准输出上的缓冲setbuf

    setbuf(stdout, NULL);
    
  • 或者使用更灵活的setvbuf

    setvbuf(stdout, NULL, _IONBF, 0);
    
2022-03-04