2016-11-29 7 views
0

この例のferrorは、エラーの場合はfprintfをチェックしますか、それとも2番目のチェックだけをチェックしますか?フェライトは複数の書き込みを実行しますか?

FILE * myout; 
if ((myout = fopen("Assignment 11.txt", "a")) != NULL) 
{ 
    fprintf(myout, "First print ", str1); 
    fprintf(myout, "Second print", str1); 

    if (ferror(myout)) 
     fprintf(stderr, "Error printing to file!"); 

    fclose(myout); 
} 
+0

私はあなたが知っているように、あなたは、各書き込みの後にチェックしたいと思うだろう正確にエラーが発生したとき。 –

+0

@Michaelはい、おそらく、完璧な世界です:)しかし、現在、私はお互いの隣に2回印刷しています。基本的に同じテキスト行の2つの部分。私は本当にどちらがエラーを起こすか気にしない、私はちょうどエラーが発生したかどうかを知る必要があります。 – Cullub

答えて

2

エラーが発生した場合clearerrがあなたのストリームで呼び出されない限り、それは、そう、はい、両方の書き込みのいずれかのエラーoccuringが記録されてリセットされません。 ferror manual pageから

関数はFerror()は、ストリームのエラーインジケータは、それが設定されている場合、非ゼロ復帰、ストリームによって指さテスト。エラーインジケータは、clearerr()関数によってのみリセットできます。

しかし、あなたは、単に何かが間違っていたかどうかを確認するためにfprintfリターンコードを使用することができます。

出力エラーが発生した場合、負の値が返されます。

fprintf manual page

このように(感謝ジョナサンオリジナルのポストに誤りを指摘して):

if (fprintf(myout, "First print %s\n", str1)<0) fprintf(stderr, "Error printing to file #1!"); 
if (fprintf(myout, "Second print %s\n", str1)<0) fprintf(stderr, "Error printing to file #2!"); 
+0

これは標準的なCの動作であることを確認できますか?Linux固有ではありませんか? – Cullub

+3

POSIX:['ferror()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/ferror.html)と ['fprint()'](http://pubs.opengroup。 org/onlinepubs/9699919799/functions/fprint.html)と['clearerr()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/clearerr.html)を参照してください。あるいは、C標準をオンラインで見つけることもできますが、POSIXはそれを回避できるC標準には反対しません。 –

+1

@JonathanLeffler:POSIXはC標準よりもはるかに読みやすく、アクセスしやすく、標準のC関数とヘッダーでは、ISO Cが要求するものを上回るPOSIX要件は通常、POSIXバージョンの "CX"マーカーで「影付き」(タグ付き)その仕様。 –

関連する問題