ここで一般的なアドバイスをします。
通常、関数は単一のジョブを実行する必要があります。この場合、単一のファイルを読み取る関数を作成しています。そのため、すべてのコマンド ライン引数にポインターを渡さないでください。開くファイルの名前への単一の読み取り専用ポインターを渡します。次に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を使用できます。0
main()
return result;
main()
私のダミー コードでは1
、エラー コードとして返されるだけです。しかし実際には、呼び出すfopen()
と、エラー コードが というグローバル変数に返されますerrno
。おそらくより良いオプションは、関数が で指定されている実際のエラー コードを返すようにすることerrno
です。main()
コードを出力する関数の print ステートメントを変更しerrno
たり、関数を使用してstrerror()
そのエラー コードを人間が判読できるメッセージに変換したりすることもできます。