10

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

一部の機能のドキュメント [ man fopenLinux など] には、それerrnoも設定されると記載されています。ただし、man fgets一切言及errnoしない。glibc の情報ページは心強いものです。

ストリームに関連するエラー インジケータの設定に加えて、ストリームを操作する関数は、ファイル記述子を操作する対応する低レベル関数と同じ方法で「errno」も設定します。

しかし、この保証がどれほど強力かはわかりません。C標準で必要ですか?Visual C/C++ ではどうなりますか?

4

2 に答える 2

6

stdioC 標準自体は、関数に対して errno WRT をあまり使用する必要はありません。それはそれを指定しますferror()が、それについてのみ言います

7.13.10.3 ferror 関数ferror 関数は、stream が指すストリームのエラー インジケータをテストします。ferror 関数は、ストリームにエラー インジケータが設定されている場合に限り、0 以外を返します。

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

Errorsの下に、特定の errno コードを含む多くの詳細情報が表示されます。

繰り返しになりますが、事実上すべての通常の Linux システムで使用される GNU C ライブラリは POSIX に準拠しているため、その情報を信頼できます ;)。これらの (オンラインの) POSIX man ページは、通常、標準の Linux システムの man ページよりも詳細です (両方を読んでください)。

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

于 2012-05-20T09:18:20.910 に答える
3

C11 標準、第 7.21 章 ("stdio.h") によると、エラーが発生した場合のみ、fgetpos書き込みます。fsetposftellerrno

于 2012-05-20T11:04:03.433 に答える