标准流
C 程序启动时自动打开三个标准流:stdin(标准输入)、stdout(标准输出)、stderr(标准错误)。这些流是 FILE* 类型,可以像普通文件一样操作。标准流让程序可以与用户、管道、重定向灵活交互。
三个标准流
#include <stdio.h>
/* stdin - 标准输入(键盘或重定向文件) */
/* stdout - 标准输出(屏幕或重定向文件) */
/* stderr - 标准错误(通常屏幕,不重定向) */
printf("Hello\n"); /* 输出到 stdout */
fprintf(stdout, "Hello\n"); /* 等价 */
scanf("%d", &x); /* 从 stdin 读取 */
fscanf(stdin, "%d", &x); /* 等价 */
fprintf(stderr, "Error!\n"); /* 错误信息输出到 stderr */
重定向
# 输入重定向
./program < input.txt
# 输出重定向
./program > output.txt
# 错误重定向
./program 2> error.log
# 输出和错误分开重定向
./program > out.log 2> err.log
# 管道
./program1 | ./program2
标准流操作
/* 从标准输入读取一行 */
char line[256];
if (fgets(line, sizeof(line), stdin) != NULL) {
printf("You entered: %s", line);
}
/* 输出到标准错误 */
fprintf(stderr, "Warning: value out of range\n");
/* 刷新输出缓冲区 */
fflush(stdout);
常见错误
混淆 stdout 和 stderr:
/* 错误信息应输出到 stderr,否则重定向时丢失 */
printf("Error occurred\n"); /* 错误:用户重定向 stdout 后看不到 */
/* 正确 */
fprintf(stderr, "Error occurred\n");
缓冲问题:
printf("Progress...");
/* 长时间操作 */
/* 如果 stdout 是行缓冲,没有换行符可能不显示 */
/* 正确 */
printf("Progress...");
fflush(stdout); /* 强制刷新 */
最佳实践
- 正常输出用
stdout,错误用stderr - 交互式提示用
stderr(避免被重定向) - 重要输出后
fflush - 理解缓冲模式(全缓冲、行缓冲、无缓冲)
- 管道通信时设计好数据格式