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

如何在C程序中获取输入重定向指定的文件名?

获取输入重定向文件名的几种方案

输入重定向是由shell处理的操作,它会将指定文件关联到程序的stdin文件描述符,程序默认无法直接从stdin获取该文件的路径。以下是几种可行的解决方法:

1. 直接通过命令行参数传递文件名(最通用)

放弃输入重定向的写法,改为将文件名作为命令行参数传入程序,这样可以直接获取到文件名,同时也能自由选择是从文件读取还是保持stdin的使用:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "用法: %s <文件名>\n", argv[0]);
        return EXIT_FAILURE;
    }

    printf("输入文件名: %s\n", argv[1]);
    
    // 示例:打开文件进行读取
    FILE *fp = fopen(argv[1], "r");
    if (!fp) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    // 后续可通过fp读取文件内容,或继续使用stdin(若仍需重定向可自行处理)
    fclose(fp);
    return EXIT_SUCCESS;
}

运行时使用./inputFileName file即可,这种方式跨平台且可靠性最高。

2. Linux系统下利用/proc文件系统

在Linux系统中,/proc/self/fd/0是指向stdin对应文件的符号链接,可通过readlink函数读取该链接的目标路径:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main() {
    char file_path[1024];
    ssize_t len = readlink("/proc/self/fd/0", file_path, sizeof(file_path) - 1);
    
    if (len == -1) {
        perror("无法读取stdin对应文件");
        return EXIT_FAILURE;
    }
    file_path[len] = '\0';
    printf("输入文件名: %s\n", file_path);
    
    return EXIT_SUCCESS;
}

注意:如果stdin的来源不是普通文件(比如管道、终端输入),该方法会输出对应设备或管道的路径,而非你期望的文件名;且该方案仅适用于Linux系统,不具备跨平台性。

3. 结合shell特性传递文件名

若必须使用输入重定向的写法,可以在执行命令时同时将文件名作为参数传入:

target_file="your_file.txt"; ./inputFileName < "$target_file" "$target_file"

程序中直接从argv[1]获取文件名即可,这种方式需要用户配合特定的命令格式。


内容的提问来源于stack exchange,提问作者Nagireddy Sai Sunhith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:05:26