【问题标题】:command line argument and file input C命令行参数和文件输入 C
【发布时间】:2012-10-22 23:02:28
【问题描述】:

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

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

所以我的主要看起来像:

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

我的函数看起来像:

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

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

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

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

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

【问题讨论】:

  • 您使用的是哪个编译器。您在哪个操作系统上运行它?

标签: c input parameters command-line-arguments


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果你写过这一行

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

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

    你也必须修复这条线

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

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

    直接放在main()函数下,可以看到argv参数

    【讨论】:

      【解决方案3】:

      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。全局变量也一样,不能使用全局变量
      • 好吧,我的方法将 FILE 指针保持在本地,并保持您的函数签名相同。 :-)
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多