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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:42:19