在 C 语言中,stdin
、stdout
和 stderr
是标准输入、标准输出和标准错误流,它们由标准库定义,用于处理程序与外部环境之间的数据交互。以下是对它们的详细解析:
1. stdin (标准输入流)
-
概念:
stdin
是一个文件指针,代表程序的标准输入。- 默认从键盘接收输入数据,但可以通过重定向改变输入源,例如从文件或管道读取数据。
-
相关函数:
- 常用于读取数据的函数包括:
scanf
/fscanf(stdin, ...)
fgets
getc(stdin)
getchar
(等价于getc(stdin)
)
- 常用于读取数据的函数包括:
-
示例代码:
#include <stdio.h> int main() { char buffer[100]; printf("Enter a string: "); fgets(buffer, 100, stdin); // 从标准输入读取数据 printf("You entered: %s", buffer); return 0; }
重定向示例:
./program < input.txt
以上命令将标准输入
stdin
指向input.txt
文件,程序从文件中读取内容。 -
2. stdout (标准输出流)
-
概念:
stdout
是一个文件指针,代表程序的标准输出。- 默认将数据输出到屏幕,但可以通过重定向将输出内容写入文件或发送到管道。
-
相关函数:
- 常用于写入数据的函数包括:
printf
/fprintf(stdout, ...)
putc(ch, stdout)
putchar(ch)
(等价于putc(ch, stdout)
)
- 常用于写入数据的函数包括:
-
示例代码:
#include <stdio.h> int main() { printf("Hello, world!\n"); // 输出到标准输出(默认屏幕) fprintf(stdout, "This is another message.\n"); return 0; }
重定向示例:
./program > output.txt
以上命令将标准输出
stdout
指向output.txt
,程序的输出内容将写入该文件。 -
3. stderr (标准错误流)
-
概念:
stderr
是一个文件指针,代表程序的标准错误输出。- 默认将错误信息输出到屏幕,但可以通过重定向改变输出目标。
- 与
stdout
不同,stderr
通常不被缓冲,确保错误信息能立即显示。
-
相关函数:
- 常用于写入错误信息的函数包括:
fprintf(stderr, ...)
fputs("Error message", stderr)
perror
(打印错误信息并附带errno
描述)
- 常用于写入错误信息的函数包括:
-
示例代码:
#include <stdio.h> int main() { int error_code = 1; if (error_code) { fprintf(stderr, "An error occurred. Error code: %d\n", error_code); } return 0; }
重定向示例:
./program 2> error.txt
以上命令将标准错误输出
stderr
指向error.txt
,程序的错误信息将写入该文件。 -
4. errno
- 在 C 标准库和 POSIX 系统中,
errno
是一个全局变量,用于表示最近一次系统调用或标准库函数发生的错误代码。 - 头文件: 包含
<errno.h>
头文件。 - 作用:
- 当系统调用或标准库函数返回错误时,通常会设置
errno
。 errno
的值是一个错误代码,对应系统中定义的错误类型。- 示例:
#include <stdio.h> #include <errno.h> #include <string.h> int main() { FILE *file = fopen("nonexistent.txt", "r"); if (file == NULL) { perror("Error opening file");//等效 printf("Error: %s\n", strerror(errno)); } return 0; }
- 当系统调用或标准库函数返回错误时,通常会设置
-
缓冲机制
-
stdin
和stdout
:- 默认使用全缓冲模式(当输出到文件或终端时,数据积累到缓冲区后才写入)。
- 如果
stdout
指向终端,通常会变为行缓冲模式。
-
stderr
:- 默认不使用缓冲区,直接输出数据,确保错误信息及时显示。
-
重定向总结
通过命令行重定向,可以控制这三个流的输入和输出目标:
-
重定向标准输入:
./program < input.txt
让
stdin
从文件读取数据。 -
重定向标准输出:
./program > output.txt
将
stdout
写入到文件。 -
重定向标准错误:
./program 2> error.txt
将
stderr
写入到文件。 -
同时重定向标准输出和标准错误:
./program > output.txt 2> error.txt
- 程序运行时的 标准输出 和 标准错误输出 全部被写入
output_and_error.txt
文件,屏幕不会显示任何输出或错误信息: -
./program > output_and_error.txt 2>&1
-
总结
stdin
:程序从中读取输入,默认是键盘。stdout
:程序将输出写入,默认是屏幕。stderr
:程序将错误信息写入,默认是屏幕,不带缓冲。-
通过这些流,程序可以方便地与外部环境进行交互,同时通过重定向灵活控制输入输出的目标。