【问题标题】:Why I couldnt work with the gcc compiler without '\n' in printf?为什么我不能在 printf 中没有 '\n' 的情况下使用 gcc 编译器?
【发布时间】:2009-09-11 12:58:25
【问题描述】:

我写了一个printf() 声明如下:

printf("hello\n");

这在使用 Linux 的 gcc 编译器构建时可以正常工作。但是,如果我写

printf("hello");

打印没有出现在屏幕上。似乎有一些缓冲机制?谁能给我更多关于这方面的信息?

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    尝试拨打fflush()。通常写入屏幕或文件非常昂贵,因此数据会被缓冲直到需要写入。一个 \n 通常就足够了(缓冲区通常一次只存储 1 行),但如果您需要刷新缓冲区 - 使用该刷新调用。

    【讨论】:

    • 特别是,fflush(STDOUT) 将刷新 printf 使用的标准输出流。
    • 记住,孩子们,stdout 是默认缓冲的,stderr 不是。
    • 顺便说一句,fflush(NULL) 将刷新 所有 个打开的缓冲区。
    • stdout 在默认情况下指向终端时是行缓冲的。 (否则块缓冲,我认为)
    【解决方案2】:

    即使缓冲不是问题,如果您不打印换行符,您的 shell 提示符可能会破坏输出。

    我不确定您在哪个环境中运行它,但是如果您在 unix shell 中使用 gcc 并且在程序结束时执行 printf("hello") 它之前不会打印换行符将显示您的 shell 提示符。提示将打印在同一行,有时会根据您设置的提示类型覆盖整行。

    【讨论】:

    • 只有当它是其中一个带有回车符的异常时:-)
    • 是的,即使没有回车,提示也会显示在输出的最后一行,看起来好像什么都没有打印给不细心的人。当然,我不承认自己过去那么不注意咳咳
    【解决方案3】:

    我在here 上发布了有关 Windows 上无缓冲 IO 的信息。

    但它是对 setvbuf 的标准 c 调用

    setvbuf(stdout, (char *)NULL, _IONBF, 0); //unbuffered stdout
    

    【讨论】:

      猜你喜欢
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多