0

私の課題では、単語や行などを数える -wc unix コマンドに似たプログラムを作成する必要があります。

フラグを読み込んで、テキスト ファイルを読み込む必要があります。

すべてのフラグを設定したので、テキスト ファイルを読み込もうとしています。私はこれを正しく行っているとは思いません。

void readInFile(char** argv, int arg)
{
   FILE *myFile;
   char c;

   myFile = fopen(argv[arg], "r");
   if(!myfile)
   {
      printf("%s not found!", argv[arg]);
      exit(EXIT_FAILURE);
   }
}

私のメインでは、関数 readInFile() を呼び出し、2 つの引数を渡します。Argv と、ファイルがあるべき要素。したがって、これが正しいと仮定します。

実際にファイルを開く際に助けが必要です。fopen() が間違っているように感じます。Cでファイルを読み書きするのは初めてです。どうもありがとう!

4

3 に答える 3

4

ここで一般的なアドバイスをします。

通常、関数は単一のジョブを実行する必要があります。この場合、単一のファイルを読み取る関数を作成しています。そのため、すべてのコマンド ライン引数にポインターを渡さないでください。開くファイルの名前への単一の読み取り専用ポインターを渡します。次にmain()、正しい引数を選択し、それを引数として渡します。

void readInFile(char const *filename)

ここで、この関数がファイルを読み込み、他に何もしない場合、何らかの方法でデータを返す必要があります。しかし、この関数が と同等のことを行う場合、おそらくファイルを読み取って出力し、関数wcにデータを返さないでしょう。main()次に、名前を改善する必要があります。

void wordcount(char const *filename)

への実際の呼び出しはfopen()私にはうまく見えます。

exit()エラーを確認し、すぐに呼び出します。それはそれを行う1つの方法です。もう 1 つの方法は、関数からエラー コードを返し、呼び出し元 (main()関数) にエラーをチェックさせ、そこでエラーを処理することです。

int wordcount(char const *filename)
{
    // ... do stuff
    if (failed)
        return 1;  // return nonzero error code on failure
    // ... do more stuff
    return 0;  // success code
}

int main(int argc, char const **argv)
{
    char const *filename;
    int result;

    filename = argv[1];
    result = wordcount(filename);
    if (result)
    {
        fprintf(stderr, "unable to open file '%s'\n", filename, result);
        exit(result);
    }
    return 0;
 }

このように単純なプログラムでは、それほど問題ではありません。しかし、ソフトウェアで大規模なシステムを構築し始めると、関数がうまく連携して動作するようになると、より満足することができます。その一部は、エラーでプログラム全体を終了させるのではなく、エラー コードを返す関数を作成することです。

0成功コードにゼロ以外を使用しているのはなぜですか? やり方が一般的です。ゼロ以外をテストするのは簡単です。if (result)多くのゼロ以外のコードがありますが、ゼロは 1 つしかないため、さまざまな種類のエラーを返すことができますが、「成功」に必要な値は 1 つだけです。

exit()fromを呼び出す代わりに、ステートメントをmain()使用できることに注意してください。からreturn戻ると、それは成功を示し、ゼロ以外の値はエラーを示します。したがって、必要に応じてfromを使用できます。0main()return result;main()

私のダミー コードでは1、エラー コードとして返されるだけです。しかし実際には、呼び出すfopen()と、エラー コードが というグローバル変数に返されますerrno。おそらくより良いオプションは、関数が で指定されている実際のエラー コードを返すようにすることerrnoです。main()コードを出力する関数の print ステートメントを変更しerrnoたり、関数を使用してstrerror()そのエラー コードを人間が判読できるメッセージに変換したりすることもできます。

于 2013-02-05T00:25:50.543 に答える
0

argv[arg]ファイルシステムに存在するファイルを参照する有効な文字列であると仮定すると、 fopen への呼び出しは正しいです。

于 2013-02-05T00:18:20.847 に答える
0

プログラム スニペットに小さなタイプミスがあります。if(!myfile) はおそらく if(!myFile) であるべきです。この変更により、コードが機能するはずです。あなたが直面しているエラーについて詳しく教えてください。

PS: 私はあなたのプログラムを試してみましたが、うまくいくようです!

于 2013-02-05T00:25:39.393 に答える