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

标签 c printf flush

为什么 printf 在调用后不会刷新,除非格式字符串中有换行符?这是 POSIX 行为吗?我怎样才能让 printf 每次都立即刷新?

最佳答案

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

  • 使用 fprintf 打印到 stderr(stderrunbuffered by default ):

    fprintf(stderr, "I will be printed immediately");
    
  • 每当需要时使用fflush刷新stdout:

    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); 
    

关于c - 为什么 printf 在调用后不会刷新,除非格式字符串中有换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37872725/

相关文章:

c - 写入初始化缓冲区时 swprintf_s 失败

multithreading - grails sessionFactory.currentSession.flushMode无法与线程一起使用?

c++ - 一个流是如何与另一个流联系在一起的?

c - 在 C 中覆盖 getdirentries

c - 使用 strtok() 从字符串中解析标记

c - 不兼容的指针类型传入 _Generic 宏

c - 我用这个 printf() 会丢失信息吗?

c# - 关闭没有 Flush() 的文件流

c - 用于检测混合 C 和 Fortran 代码中的段错误的 GUI 工具

c - 双指针地址