在做题的时候遇到了fprintf(stdout,”hello”);和fprintf(stderr,”world!”),问输出结果。fprintf是输出到文件,在前面博客中有描述:http://blog.csdn.net/magiclyj/article/details/71373817;
在编译器上运行代码发现有点诡异,哈哈言过了,于是在网上查询和自己在编译器上测试了一下。我们来具体看看本尊:
stdout, stdin, stderr的中文名字分别是标准输出,标准输入和标准错误。三者都被定义在#include<stdio.h>
头文件中,stdin的默认是从键盘输入,stdout和stderr的默认是输出到屏幕上。但是stdout和stderr二者输出是有区别的:
stdout输出和cout以及printf输出一样,带有缓存区的输出,先将数据输到缓存区里在遇到换行或者程序结束后输出到屏幕。
stderr输出和cerr、flush函数类似,它也是错误输出,直接输出到屏幕,不经过缓存区,但是不同的是stderr不带有清除缓存区的功能。
我们先看看下面这段代码的输出:
运行结果:
输出是:world!hello ,而不是helloworld!
原因就是因为stderr和stdout的输出原理不同,如果加上换行我们在来看看:
运行结果:
这里由于加了换行输出顺序正确,也证实了stdout输出流遇到换行会输出。
有时候我们可以手动的设置代码来改变三者的方向,可以让输出到文件中,这就需要我们设置重定向。例如定向到文件:
如果屏蔽一个,被屏蔽的会在屏幕显示,没有被屏蔽的则输出到文件中,打开文件可以看到。可以自己代码测试一下顺便加深记忆!!!
顺便提醒freopen、fopen、fdopen三个都是文件操作函数,原型:
#include<stdio.h>
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, cosnt char *mode, FILE *stream);