3

どう聞いたらいいのかわからない…

関数からファイルを読み取りたいとしますが、ファイル名はメイン関数でコマンドライン引数 (argv[]) として渡されるため、読み取りたいファイル名がどうなるかわかりません。

私のメインは次のようになります:

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

私の関数は次のようになります。

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

私が自分の機能で試したこと:

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

しかし、コンパイラは変数argvを認識しないと言った

それで、誰かがメインでなく、コマンドラインパラメータを処理しなければならないときに入力ファイルを呼び出す方法を理解するのを手伝ってもらえますか?

4

4 に答える 4

5

まず、 a を逆参照しないでください。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;
}
于 2012-11-02T09:40:36.793 に答える
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, ...);
}
于 2012-11-02T09:39:32.643 に答える
0

この行を書いている場合

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

そのget_corners()ため、argv はグローバル変数ではないことを知っておく必要があります。main()これは、関数によってのみ見られる変数です

また、この行を修正する必要があります

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

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

main()argvパラメーターを確認するために、関数のすぐ下に配置します

于 2012-11-02T09:58:58.803 に答える
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;
}
于 2012-11-02T10:03:33.037 に答える