stdout、stdin和stderr

在做题的时候遇到了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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值