在Unix命令行中,我需要使用输入重定向来指定输入文件:
./a.out < filename
这是我的源代码:
int main(int argc, char *argv[]) {
char fileName[30];
fgets(fileName, sizeof fileName, stdin);
printf("%s\n", fileName);
}
程序打印整数而不是文件名。如果我使用scanf("%s", fileName);
我的google-fu让我失望了。我做错了什么?
编辑:需要使用输入重定向(<
,特别是),因此命令行参数不是一个选项。但是,我不需要实际知道文件名,我只需要从文件中读取换行符分隔的整数。我似乎在问错误的问题。
答案 0 :(得分:4)
我只需要从文件中读取换行符分隔的整数。我似乎在问错误的问题。
shell的输入重定向操作符<
将命名文件与程序的标准输入相关联。您的程序不需要采取任何特殊操作来打开文件 - 它已经打开。只需从输入中读取,就像用户在键盘上输入一样:
/* foo.c */
#include <stdio.h>
int main(int ac, char **av) {
int i;
while(scanf("%d", &i) == 1) {
printf("Got one!: %d\n", i);
}
return 0;
}
编译你的程序:
cc foo.c
然后运行它:
a.out < filename
答案 1 :(得分:3)
没有(简单)方法从重定向流中获取文件名,因为您看到的所有应用程序都是一个打开的文件描述符。有一种“硬”方式仅适用于Linux:readlink("/proc/self/fd/0")
。
如果您必须知道文件名,请将其作为常规参数(./a.out filename
)传递,并查看argv[1]
而不是使用输入重定向。
但是,既然您只想阅读文件(并且您不关心文件名),那么只需阅读stdin
即可。
答案 2 :(得分:1)
看起来你正试图通过stdin将一些文件名传递给你的程序。在这种情况下,filename
应该是文件,而不是字符串。您需要的是简单地将您需要的文件名作为命令参数(./a.out filename
)传递,并从argv
中将其从程序中提取出来。