从C中的输入重定向读取整数

时间:2012-10-10 14:53:54

标签: c unix redirect scanf fgets

在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让我失望了。我做错了什么?

编辑:需要使用输入重定向(<,特别是),因此命令行参数不是一个选项。但是,我不需要实际知道文件名,我只需要从文件中读取换行符分隔的整数。我似乎在问错误的问题。

3 个答案:

答案 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中将其从程序中提取出来。