繁体   English   中英

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

[英]command line argument and file input C

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

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

所以我的主要看起来像:

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

我的功能看起来像:

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

我在我的功能中尝试过的:

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

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

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

首先,你不应该取消引用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;
}

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, ...);
}

如果你写了这一行

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

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

你还得修这条线

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

通过

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

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

如果要求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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM