以下程序显示当发生“除以零”等错误时,缓冲的I / O如何导致程序出现问题:
int main()
{
int a = 1, b = 0, c;
printf("Dividing...");
c = a/b;
printf("Answer is: %d\n", c);
return 0;
}
输出是 Floating point exception (core dumped)
.
很公平 . 但令人惊讶的是,如果我将第一个printf更改为 printf("Dividing...\n");
,这个文本实际上会在程序崩溃之前打印出来(顺便说一句,我在Linux上运行GCC) .
我是否可以得出结论,添加换行符相当于刷新?如果是这样,如果我所有的 printf()
字符串都在 \n
结束,我实际上是在剥夺自己缓冲I / O的好处?
1 回答
如果你的标准输出是去一个终端,是的,它等于刷新,因为
printf()
将使用基于行的缓冲 .如果它被重定向到一个文件,那么没有 . 在这种情况下,
printf()
使用更大的缓冲区,通常对应于文件系统块大小或其他,以优化IO .