C语言如何通过命令行重定向读取任意文本文件并逐行输出
解决C语言命令行重定向读取文件的问题
核心原理:利用标准输入(stdin)
当你用./atc < example_input_001.txt这种重定向命令时,系统已经把程序的**标准输入流(stdin)**替换成了指定的文件。这时候你不需要再用fopen手动打开文件,直接从stdin读取内容即可。
修改后的代码示例
#include <stdio.h> #include <stdlib.h> #define BUFFER_SIZE 1024 // 定义每行的最大读取长度 int main() { char line[BUFFER_SIZE]; // 逐行读取标准输入(即重定向的文件) while (fgets(line, sizeof(line), stdin) != NULL) { // 直接输出读取到的行 printf("%s", line); } // 检查读取过程中是否出错 if (ferror(stdin)) { fprintf(stderr, "读取文件时发生错误\n"); exit(1); } return 0; }
代码说明
fgets(line, sizeof(line), stdin):从标准输入读取一行内容,存入line数组,直到遇到换行符、达到缓冲区上限或文件结束。- 循环条件
fgets(...) != NULL:当读到文件末尾(EOF)时,fgets返回NULL,循环结束。 ferror(stdin):用来检查读取过程中是否发生错误(比如文件损坏),如果出错就向标准错误流输出提示并退出。
额外扩展:同时支持重定向和命令行参数传文件名
如果想让程序既支持./atc < file.txt,也支持./atc file.txt这种直接传文件名的方式,可以使用以下代码:
#include <stdio.h> #include <stdlib.h> #define BUFFER_SIZE 1024 int main(int argc, char *argv[]) { FILE *input_file = stdin; // 默认从标准输入读取 // 如果命令行传入了文件名参数 if (argc == 2) { input_file = fopen(argv[1], "r"); if (input_file == NULL) { fprintf(stderr, "无法打开文件: %s\n", argv[1]); exit(1); } } else if (argc > 2) { fprintf(stderr, "用法: %s [文件名]\n", argv[0]); exit(1); } char line[BUFFER_SIZE]; while (fgets(line, sizeof(line), input_file) != NULL) { printf("%s", line); } if (ferror(input_file)) { fprintf(stderr, "读取文件时发生错误\n"); exit(1); } // 如果不是标准输入,记得关闭文件 if (input_file != stdin) { fclose(input_file); } return 0; }
这个版本的程序:
- 不传参数时,从标准输入读取(支持重定向)
- 传入一个文件名参数时,打开该文件读取
- 参数过多时,输出用法提示
内容的提问来源于stack exchange,提问作者Luca Agius
相关产品推荐
相关产品推荐

