2

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

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

4

3 回答 3

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
于 2012-10-10T15:01:33.607 回答
3

没有(简单的)方法可以从重定向的流中获取文件名,因为您的应用程序看到的只是一个打开的文件描述符。有一种仅适用于 Linux 的“硬”方式:readlink("/proc/self/fd/0").

如果您必须知道文件名,请将其作为常规参数 ( ./a.out filename) 传递并查看argv[1]而不是使用输入重定向。

但是,由于您只想读取文件(并且您不关心文件名),因此只需stdin按照您已经在执行的操作进行读取。

于 2012-10-10T14:57:20.183 回答
1

看起来您正试图通过标准输入将一些文件名传递给您的程序。在这种情况下filename应该是一个文件,而不是一个字符串。您只需将所需的文件名作为命令参数 ( ./a.out filename) 传递,然后将其从argv.

于 2012-10-10T14:57:02.397 回答