在Linux终端中打开用户指定的文件名

时间:2013-09-16 20:11:04

标签: c linux file-io

我在Linux上用C编写程序,我想让用户指定一个从终端打开的文本文件。所以用户输入:

./program < nums.txt

程序将读取该.txt文件中的内容。目前,我使用以下代码指定要自行打开的文件名:

fp = fopen("nums.txt","r");

请注意,nums.txt只包含两个用空格分隔的数字,用于最小值和最大值。

我只是在学习C而且不确定如何去做。我搜索过Stack Overflow并使用了搜索引擎,但仍然无法解决这个问题。

感谢。

2 个答案:

答案 0 :(得分:1)

了解shell输入重定向的工作原理可能会有所帮助。

对于您提供的命令行,shell将打开文件并将其连接到进程的标准输入。 C已经有一个标准输入流,所以你可以像这样使用它,不需要fopen

fp = stdin;

另一方面,如果您希望用户像这样运行您的程序:

./program nums.txt

然后,您将要使用argc函数的argvmain参数,例如:

int main(int argc, char **argv)
{
    if (argc < 2)
        return 1;

    FILE *fp = fopen(argv[1], "r");

...

argc变量包含传递的参数数量,argv是一个数组,每个参数都作为字符串。用于调用程序的名称通常是第一个元素(argv[0]),这就是我使用argv[1]的原因。并且,与使用数组时一样,请确保您不要尝试访问结束。

答案 1 :(得分:0)

以下是如何阅读标准输入的第一个字符(用作./program <nums.txt):

#include <stdio.h>
int main(int argc, char **argv) {
  FILE *f = stdin;
  int c = getc(f);
  /* int c = getchar();  -- Same as above. */
  if (c >= 0) printf("%c\n", c);
  return 0;
}

以下是如何读取命令行中指定的文件的第一个字符(用作./program nums.txt):

#include <stdio.h>
int main(int argc, char **argv) {
  FILE *f = fopen(argv[1], "r");
  /* TODO: Handle f == NULL. */
  int c = getc(f);
  if (c >= 0) printf("%c\n", c);
  return 0;
}