命令行参数和文件输入C.

时间:2012-11-02 09:36:55

标签: c input parameters command-line-arguments

我真的不知道怎么问这个......

假设我想从我的函数中读取一个文件,但我不知道我想要读取的文件名是什么,因为文件名将在我的main函数中作为命令行参数传递(argv [])

所以我的主要看起来像:

int main(int argc, char *argv[])

我的功能如下:

int get_corners(FILE *input, int size, and so on)

我在我的功能中尝试过:

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

但是,编译器说它不识别变量argv

那么,有人可以帮助我了解如何在不在主要时调用输入文件并且必须处理命令行参数吗?

4 个答案:

答案 0 :(得分:5)

首先,您不应取消引用FILE*,结构不透明。这意味着你只需传递指针。

其次你想要的是将你从命令行获得的文件名作为函数参数传递给你的函数。在C中,变量不是在运行时或编译时从其他函数的作用域继承的。

像这样的东西

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

   printf("%d corners\n", getCorners(argv[1]));
}


int getCorners(char* file) {
    FILE* input = fopen(file, "r");

    .. do soemthing interesting ...


    return cornerCount;
}

答案 1 :(得分:1)

argv只是函数的一个参数,就像其他任何东西一样。除非你将它设为全局或将其传递给“get_corners”,否则它在该函数中是不可见的。

老实说,无论如何,你可能更好地处理该文件与“get_corners”工作分开,它看起来更干净。尝试使用函数打开并管理读取文件的错误,然后将其输出传递给get_corners。此外,您需要更仔细地解析命令行,而不仅仅是随便传递它。您可以在* NIX中查看getopts来帮助您,还有很多其他库可以让您轻松完成任务。

FILE *readfile(filename)
{
    FILE *f = fopen(filename, "r");
    // Do some error checking
    return f;
}

main (int arc, char *argv[])
{
    FILE *myfile;
    myfile = readfile(argv[1]);
    get_corners(myfile, ...);
}

答案 2 :(得分:0)

如果你写了这一行

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

get_corners()函数下,因此您必须知道argv不是全局变量。它只是main()函数看到的变量

你也必须修理这一行

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

通过

input = fopen(argv[1], "r");

并将其直接置于main()函数下以查看argv参数

答案 3 :(得分:0)

如果要求get_corners()使用FILE *,那么您只需在main()中打开文件,其中argv可用,并传递结果指针功能:

int main(int argc, char *argv[])
{
  if(argc > 1)
  {
    FILE *input = fopen(argv[1], "r");
    if(input != NULL)
    {
      const int corners = get_corners(input);
      fclose(input);
      /* Do something with corners here ... */
    }
  }

  return EXIT_SUCCESS;
}