将换行符添加到printf()等效于刷新流吗?
以下程序显示当发生“除以零”之类的错误时,缓冲的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的好处?
如果您的标准输出要转到终端,是的,它等于刷新,因为printf()
将使用基于行的缓冲。
如果它被重定向到一个文件,那么没有。 在这种情况下, printf()
使用更大的缓冲区,通常对应于文件系统块大小或其他,以优化IO。