【问题标题】:Can printf write to terminal without flushing stdout?printf 可以在不刷新标准输出的情况下写入终端吗?
【发布时间】:2021-10-20 17:45:27
【问题描述】:
#include <stdio.h>

int main(){
 char a[2] = {0};
 a[0] = 't';
 printf("%s", a);

 scanf("%c", a);
 return 0;
}

scanf 这里会导致标准输出的自动刷新。 运行a.out会在运行scanf之前在终端打印t,更多信息:How is printf getting flushed before scanf is executed?

但是,执行a.out &gt; out.txt 并使用^C 终止它不会在out.txt 中打印任何内容,但输出仍会出现在屏幕上,而不会使用&gt; 重定向标准输出。

如果正在刷新标准输出,那么为什么out.txt 仍然是空的? 如果它没有被刷新,那么t 在第一个示例中是如何出现在屏幕上的?

(我知道使用 \n 或手动 fflush 或正确终止程序将解决问题,我只是对这种行为感到好奇)。

【问题讨论】:

    标签: c


    【解决方案1】:

    关键是交互式这个词:

    交互式设备的输入和输出动态应按照 7.21.3 中的规定进行。

    一旦您将标准输出重定向到一个文件,它就不再是交互式

    例如,Linux C 标准库实际上执行isatty 库调用的模拟来解决这个问题。如果它发现标准输出没有被定向到文件,它也会破坏这种关系。它还将提高作为命令管道的一部分工作的程序的 I/O 性能。


    你可以通过执行来测试stdout是否连接到终端

    #include <unistd.h>
    
    printf("stdout is connected to a terminal: %d\n", isatty(fileno(stdout)));
    

    【讨论】:

    • 除此之外,标准规定“交互式”的定义是实现定义的。因此,不应假定任何特定的冲洗行为。如果在scanf() 之前刷新stdout 很重要,则应显式刷新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多