2012-05-20 9 views
10

stdioストリームでエラーが発生した場合(EOFではなく)、ストリームのエラーインジケータが設定され、ferror()が0以外の値を返すようになります。私はいつもより多くの情報がerrnoで利用可能であると仮定してきました。しかし、私はこれをどのように知っていますか?stdioは常にerrnoを設定しますか?

いくつかの機能のドキュメント[例: Linuxのman fopen]にはerrnoも設定されています。しかしながら、man fgetsは、errnoを全く言及していない。 glibcの情報ページは安心している: ストリームに関連付けられたエラー・インジケータを設定することに加えて

、ストリーム上で動作する機能はまた、その対応する低レベルの関数として 同様に、 `のerrno「を設定しますファイル の記述子を操作します。

しかし、私はこの保証がどれほど強いのか分かりません。それはC標準によって要求されていますか? Visual C/C++ではどうなりますか?

答えて

5

Cスタンダード自体は、errno WRTからstdioまでの関数をあまり使用する必要はありません。それはferror()を指定するが、ferror関数機能やferror関数は、ストリームのエラーインジケータをテスト7.13.10.3その

は、streamが指すだけそれを言います。エラー標識がストリームに設定されている場合に限り、ferror関数は非ゼロを返します。

C99ドラフト:http://www.vmunix.com/~gabor/c/draft.html。使用される実際のエラーコードは、ほとんどの場合、実装が定義されています。

しかし、Linux上でGNU Cライブラリはまた、POSIX仕様に準拠しています。より多くのも、この文脈で定義されている

http://pubs.opengroup.org/onlinepubs/9699919799/toc.htm

。あなたがfopenページを見ればたとえば、:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/fopen.html

あなたはエラーの下で、特定のerrnoコードなど、詳細な情報の多くが表示されます。

また、ほぼすべての通常のLinuxシステムで使用されているGNU Cライブラリは、POSIXに準拠しているので、その情報を信頼することができます。これらの(オンライン)POSIXのマニュアルページは、一般に、標準のLinuxシステムのマニュアルページよりも詳細です(両方を読んでください)。

他の(POSIX以外の)プラットフォームでのWRTファイル操作には、独自の実装があります。残念なことに、そのようなものは標準Cでは透過的に移植できません。しかし、C++ストリームは標準化されたエラー処理をしています。 errno

+1

ありがとうございました。 POSIXの定義は非常に役に立ちます。例えば、それらに応じて、 "fgets"は実際にerrnoを設定します。私は、特定のケースのための最良の戦略は、POSIXのために書いて、Windowsの問題を解決することだと思います。 –

3

C11標準規格によれば、章7.21( "stdio.hの")のみfgetposfsetposftell書き込みエラーが発生した場合です。

関連する問題