您的位置:首页 > 其它

stdout、stdin和stderr

2017-07-22 11:45 288 查看
在做题的时候遇到了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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stdout stdin stderr