gpt4 book ai didi

printf 可以在不刷新标准输出的情况下写入终端吗?

转载 作者:行者123 更新时间:2023-12-04 14:02:07 26 4
gpt4 key购买 nike

#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 > out.txt 并以 ^C 终止它不会在 out.txt 中打印任何内容输出仍然出现在屏幕上,没有使用 > 重定向 stdout。

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

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

最佳答案

关键是互动这个词:

The input and output dynamics of interactive devices shall take place as specified in 7.21.3.

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

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


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

#include <unistd.h>

printf("stdout is connected to a terminal: %d\n", isatty(fileno(stdout)));

关于printf 可以在不刷新标准输出的情况下写入终端吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69650765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com