stdout、stdin和stderr

本文介绍了C语言中标准输出(stdout)和标准错误输出(stderr)的区别。stdout与printf和cout相似,具有缓存机制;而stderr类似于cerr和flush,直接输出到屏幕且不缓存。文章通过实例演示了两者的不同输出行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做题的时候遇到了fprintf(stdout,”hello”);和fprintf(stderr,”world!”),问输出结果。fprintf是输出到文件,在前面博客中有描述:http://blog.youkuaiyun.com/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);
### C语言中 `fprintf`、`printf`、`stdin`、`stdout` `stderr` 的用法及区别 #### 函数与宏定义概述 在C语言编程环境中,`stdin`, `stdout`, `stderr` 是预定义的标准I/O流文件指针。这些文件指针对应着程序运行时默认连接至终端设备的三个标准通道:标准输入(通常是键盘)、标准输出(通常是指向屏幕)标准错误输出(同样指向屏幕但专用于显示错误信息)。当操作系统启动一个进程时会自动创建这三个文件描述符并赋予特定编号——0对应`stdin`;1对应`stdout`; 2则分配给`stderr`。 对于输出操作而言: - **`printf()`** 函数可以看作是对 `stdout` 进行写入的一种便捷方式[^1]。其功能上等价于调用带有第一个参数设定为 `stdout` 的 `fprintf()` 函数。 - **`fprintf()`** 则是一个更为通用的形式化输出函数,允许指定任意有效的FILE * 类型的目标作为输出目的地,并支持格式化的字符串打印[^3]。 而对于错误消息处理方面有专门设计用来向 `stderr` 发送数据的方法: - 使用 perror() 可以方便地将当前线程最后一次发生的系统级错误转换成人类可读的信息并通过 `stderr` 显示出来,这实际上也是通过内部调用了类似于 `fprintf(stderr,"...")` 的机制实现。 关于缓冲特性上的差异值得注意的是: - 默认情况下,`stdout` 流采用行缓存模式工作,在接收到换行字符(`'\n'`)之前不会立即将待发送的数据刷新到实际目标位置除非显式执行了 `fflush(stdout)` 或者遇到了程序结束等情况触发强制刷盘动作; - 相较之下,为了确保异常情况能够被及时发现,`stderr` 设计成了无缓存状态,任何尝试往里面写入的内容都会立刻呈现给用户查看而不必等待额外条件满足后再做统一提交[^2]。 下面给出一段简单的示范代码来展示上述概念的实际应用效果: ```c #include <stdio.h> int main(void){ char str[]="Hello World!"; // 向标准输出打印一条带格式的消息 printf("%s\n",str); // 将相同内容再次发往 stdout ,形式略有不同而已 fprintf(stdout,"%s (via stdout)\n",str); // 假设发生某种错误状况,则可通过如下方法记录下来 fprintf(stderr,"Error occurred while processing %s (via stderr).\n",str); return 0; } ``` 此段代码先利用 `printf()` 打印了一条问候语句,接着又借助 `fprintf()` 对同一句话进行了重复输出只不过这次明确指定了流向为 `stdout` 。最后模拟了一个可能出现的错误场景并将相应提示经由 `stderr` 渠道传达出去以便引起注意。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值