请看下面的代码:
- /* file: test.c */
- /* 编译环境:gcc 版本 4.2.4 (Ubuntu 4.2.4-1ubuntu) */
-
#include <stdio.h>
-
-
int main(int argc, char **argv)
-
{
-
fprintf(stdout,"this is stdout");
-
/*fprintf(stdout,"\n");*/
-
fprintf(stderr,"this is stderr\n");
-
fprintf(stdout,"\n");
-
return 0;
-
}
仔细考虑一下输出结果......
正确的结果是:
- this is stderr
-
this is stdout
解释如下:
原理:当进程运行时,系统会为该进程默认打开stdin(标准输入,一般是键盘)、stdout(标准输出,一般是显示器)以及stderr(标准出错,一般是显示器)三个设备。而这里要注意stdout与stderr共用显示器,fprintf采用的是流式输出,在没有"\n"的情况下,fprintf只是把你要打印的数据写到了输出缓冲区中(分为标准输出缓冲区、标准出错缓冲区,它们是不同的),但并不一定真正地写到了显示器上了(除非输出缓冲区已经满了,才会写到真正的设备上)。
解释:对于上面的代码,首先"this is stdout"被写入标准输出缓冲区中;然后"this is stderr\n"被写到标注出错缓冲区中,并写到显示器设备上(因为有"\n");最后"\n"被添加到标准输出缓冲区中(此时标准缓冲区中的数据为"this is stdout\n"),并写到显示器设备上。为了验证,可以把源代码中的/*fprintf(stdout,"\n");*/去掉注释,然后在运行程序。
注意:不同的编译器可能结果不同,我用的是gcc 版本 4.2.4 (Ubuntu 4.2.4-1ubuntu)
阅读(1784) | 评论(0) | 转发(0) |