stdout、stdin和stderr

(4) 2024-04-26 18:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说stdout、stdin和stderr,希望能够帮助你!!!。

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

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复