You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:57:01