2009-12-11 16 views
6

私のCプログラムでは、この関数は特定のファイルを開いてファイルポインタを返すすべての作業を処理するため、メイン関数やその他の関数はfpを使用してコンテンツを読み取ることができますこれを動作させることができませんでした。関数Cからの戻りポインタ

私は言語を学んでいるだけなので、私は何か非常に間違っている可能性があります。最初の行で

int open_text_file(char text_file_name[]) 
{ 
    FILE *fp; 

    if((fp = fopen(text_file_name, "r")) != 0) 
    { 
      return fp; 
    } 

    else 
    { 
      printf("Cannot open file \"%s\"\n", text_file_name); 
    } 
} 
+1

'FILE'構造体へのポインタを' int'として返そうとしています。何(そのエラーのほかに)あなたは見ていますか? –

+1

コーディングスタイルの問題として、 'fp'と' 0'ではなく 'NULL'を比較する必要があります。また、 'fp'の代入と別のステートメントへの比較を分離するために、より明確になるかもしれません。 –

答えて

11

あなたが持っている必要がありますどのようなint があなたの "他" に、同様

FILE * open_text_file(char text_file_name[]) 

であるとして、あなたは

int open_text_file(char text_file_name[]) 

を持っているこれは、戻り値の型を宣言します場合は、 というエラーを発信者に返す必要があります。

return NULL 

が適切です。あなたがそれを呼び出すときに戻り値を確認することを確認してください。

+0

パーフェクト、今私はargv [1]を関数に渡してmainから内容を出力することができます。 あなたの多くが言うように、私はfpとNULLを比較する必要があります、なぜそれ? – KJ0090

+0

いくつかの一般的でないプラットフォームでは、NULLは0ではないかもしれませんが、C++ではそうではありません。 – McPherrinM

0

FILE* open_text_file();がプロトタイプである必要があります。

intFILE*ではありません。

6

この関数は、fopen()が行うものとエラーメッセージを加えたものですから、意味がありません。これは良いデザインではありません。エラーブランチは(おそらくはNULLの)ポインタも返さなければならないからです。ポインタは呼び出しコードで再度テストする必要があります。

FILE * fp = fopen(somefile, "r"); 
if (fp == NULL) { 
    fprintf(stderr, "Cannot open %s\n", somefile); 
    exit(1); // or whatever you need to do to handle the error 
} 
+0

+1、この関数は実際には無意味です。 –