C语言如何读取通过<输入重定向传入而非命令行参数的文件内容
结论
你的推测完全正确,< 属于Shell提供的输入重定向语法,dog.txt 不会作为命令行参数传入程序,它的内容会被Shell直接绑定到程序的 标准输入流(stdin),你直接读取stdin即可获取文件内容。
原理说明
你执行的命令 ./cat 10 60 < dog.txt 分为两部分:
- 空格分隔的
./cat、10、60是命令行参数,对应C语言中main函数的argc(值为3)和argv数组的内容,也是你遍历参数时能拿到的全部内容。 < dog.txt是Shell执行层面的操作,Shell会在启动你的程序前打开dog.txt,把文件内容写入程序的标准输入通道,不需要你的程序主动打开这个文件。
代码实现
以下是两种常见的读取重定向输入的方式:
方式1:逐字符读取(适合任意格式内容处理)
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { // 先读取处理你传入的命令行参数 int param1 = atoi(argv[1]); // 对应命令里的10 int param2 = atoi(argv[2]); // 对应命令里的60 // 读取标准输入里的dog.txt内容 int ch; // 读到EOF(文件结束标记)就停止 while ((ch = getchar()) != EOF) { // 这里替换为你自己的内容处理逻辑,示例是直接打印 putchar(ch); } return 0; }
方式2:逐行读取(适合纯文本行处理场景)
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int param1 = atoi(argv[1]); int param2 = atoi(argv[2]); // 定义行缓冲区,大小按需调整即可 char line_buf[1024]; // 每次读取一行内容到缓冲区 while (fgets(line_buf, sizeof(line_buf), stdin) != NULL) { // 替换为自己的处理逻辑,示例直接打印 printf("%s", line_buf); } return 0; }
补充提示
如果需要同时支持「将文件名作为命令行参数传入」和「重定向输入」两种使用方式,你可以判断argc的数量:如果argc >=4,就取argv[3]作为文件名调用fopen打开读取;如果argc ==3,就直接读取stdin即可。
内容的提问来源于stack exchange,提问作者TheMathAI
相关产品推荐
相关产品推荐

