【问题标题】:Reading integers from input redirection in C从 C 中的输入重定向中读取整数
【发布时间】:2012-10-10 14:53:54
【问题描述】:

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

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

【问题讨论】:

  • 也许“文件名”恰好以只有一个数字的行开头?
  • 您是 (1) 尝试使用标准输入读取名为 'filename' 的文件的内容,还是 (2) 尝试读取文件的名称,然后您将使用 open() 并读取文件 i/o?
  • @nos 这是我的误解。我认为< 会将命令行的其余部分读取为标准输入,此时我必须打开文件并从中读取。但是,< 运算符会打开文件并将其内容视为标准输入的输入。我把问题复杂化了。

标签: c unix redirect scanf fgets


【解决方案1】:

我只需要从文件中读取以换行符分隔的整数。看来我问错问题了。

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

【讨论】:

  • 这是完美的。非常感谢。
【解决方案2】:

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

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

但是,由于您只想读取文件(并且您不关心文件名),因此您只需从 stdin 读取即可。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-08-05
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 2014-02-14
      • 2014-08-18
      • 2021-09-17
      • 2012-03-24
      相关资源
      最近更新 更多