如何在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
相关产品推荐
相关产品推荐

