可能重复:
Why does printf not flush after the call unless a newline is in the format string? (in C)
您好,
我在C中使用sleep()函数,遇到了一个问题:我不确定这是不是问题,所以我将整个代码简化为:
int main() {
printf("1");
sleep(3);
printf("2");
return 0;
}
我认为这应该产生1 ..等待3秒.. 2.而程序等待3秒然后打印12.有没有办法使用睡眠功能,以便我得到第一个输出?
由于
答案 0 :(得分:3)
实际上并不是延迟输出的睡眠功能,它是标准输出流的缓冲特性。 2
的输出几乎肯定也延迟,直到你的程序退出main,但是那里的延迟很小,你没有注意到它。
标准输出是行缓冲的,如果可以检测到它是指交互设备(否则它是完全缓冲的)。
如果您希望立即看到每个输出调用后fflush (stdout)
,那么将解决问题。
或者,您可以在操作setvbuf
之前使用stdout
,将其设置为无缓冲,您不必担心将所有fflush
行添加到代码中:< / p>
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
请记住,如果您将输出发送到文件,可能会影响性能。另请注意,对此的支持是实现定义的,不受标准保证。
ISO C99部分7.19.3/3
是相关位:
当流 unbuffered 时,字符应尽快从源或目的地出现。否则,字符可以作为块累积并传输到主机环境或从主机环境传输。
当流完全缓冲时,在填充缓冲区时,字符应作为块传输到主机环境或从主机环境传输。
当流行缓冲时,当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输。
此外,当填充缓冲区,在无缓冲流上请求输入时,或者在需要传输字符的行缓冲流上请求输入时,字符旨在作为块传输到主机环境。主机环境。
对这些特征的支持是实现定义的,可能会受到
setbuf
和setvbuf
函数的影响。
答案 1 :(得分:1)
标准库缓冲输出,等待有足够的输出来分摊实际打印的成本。
每次打印后都必须刷新缓冲区,以确保在代码继续之前打印缓冲区:
fflush(stdout);
答案 2 :(得分:1)
答案 3 :(得分:0)
尝试:
int main() {
printf("1"); fflush(stdout);
sleep(3);
printf("2"); fflush(stdout);
return 0;
}
强制io库在sleep和return语句之前清空它的缓冲区。