2016-10-24 8 views
2

fread()がエラーを発生させたときにチェックしようとしているので、ferror()を使用します。freadとferrorがerrnoを設定しない

chunk = fread(buf, 1, 100, file); 
if (ferror(file)) 
    { 
    return errno; 
    } 

しかし、ferror() manページは言う:

エラーがこれらの関数は失敗すべきではなく、外部変数errnoを設定しないでください。

だから、どのように私は、ファイルが読み込まれたときfread()ferror()errnoを設定しなかったものの、エラーの種類は、発生を知ることができますか?

+3

[fread(3)](http://man7.org/linux/man-pages/man3/fread.3.html)を読んだことがありますか?それは誤って文書化された動作をしています! –

+0

はい、errnoの設定について何も言及していません。 –

+2

@BasileStarynkevitch彼のポイントはまさにそれだと思います。確かに 'ferror'はエラーが起こったと言うことができますが、' fread'は 'errno'を設定するために文書化されていないので、' errno'が勝ったので、ストリームエラー状態を照らした特定のエラー状態を反映していませんか? – WhozCraig

答えて

1

あなたがここからそこに着くことができません。

freadは(あなたが発見したとして)errnoを設定していない、そのようにあなたが本当に特定エラー状態について多くを決定することはできません。そこにあるのはです。エラーの正確な性質は一般的にインプリメンテーション依存です。それを集めるC標準ライブラリベースの移植可能な方法はありません。

特定のシステムレベルのエラーについては、システムコールにスラミングすることができます。途中でIOバッファリングがうまくいかないなどの落とし穴に悩まされる可能性があります。 POSIXは幾分あなたの救助に来ることができます。 readerrnoと設定して、かなり詳細な結果が得られます。作業しているプラ​​ットフォームがPOSIXに準拠していて、そのコードが実際に知っているほど非常に重要であれば、それはあなたの選択肢かもしれません。

しかし、C標準ライブラリからは、エラーが発生したということ以外にはほとんど気づかないでしょう。とにかくそれ以上のものは必要ありません。

1

これらの関数はerrnoを使用しないため、どちらも使用しないでください。

戻り値fread()からすべてがスムーズに進んだかどうかを知ることができます。 fread()の戻り値が、渡されたnmembパラメータ(あなたの場合は100)と異なる場合は、ファイルの最後に達したか、エラーが発生しています(source)。だから、唯一その場合のテスト:

だけalltogether errnoの使用をドロップ:

chunk = fread(buf, 1, 100, file); 
if (chunk != 100) { // If fread() returns a number different to the nmemb parameter, either error or EOF occured 
    if (ferror(file)) 
     { 
     printf("Error occured while reading file."); 
     return -1; // Or what ever return value you use to indicate an error 
     } 
} 
+1

間違っています。 'fread'はエラーで文書化された振る舞いをしています。 –

+0

@BasileStarynkevitch 'fread'は、エラーまたはファイルの終わりの動作を文書化しました。エラーであるかどうかを調べるには 'ferror()'を使い、ファイルの終わりでは 'feof()'を使う必要があります。 – Magisch

関連する問題