命令行参数和文件输入C

3

我不太知道该如何提问...

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

所以我的主函数看起来像:

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

我的函数将会是这样的:

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

我在我的函数中尝试过的:

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

但是编译器说它无法识别变量argv。

那么,有人能帮我理解如何在不在主函数中时调用输入文件并处理命令行参数吗?


1
你使用哪个编译器?你在哪个操作系统上运行它? - Krishnabhadra
4个回答

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

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

问题在于函数定义已经由教师确定,因此不能有argv。全局变量也是如此,我们不允许使用全局变量。 - Cindy Thajeb
我的方法将文件指针保持在本地,并保持您的函数签名不变。 :-) - Joe

0

如果你已经写了这行代码

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

get_corners()函数下面,你必须知道argv不是一个全局变量。它只是main()函数可见的变量。
另外,你还需要修复这行代码。
*input = fopen(argv[1], "r");

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

并将其直接放在main()函数下面,以查看argv参数


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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接