私はK & R(第2版)の新しいミスを発見したと思います。正誤表に現れないK&R(第2版)の新しいミス?
164ページで、「ファイルの終了」が発生した場合、「feof」は0以外を返します。
170ページで、「ファイルの終わり」に達したときに「read」が0を返すと書かれています。
176 K&Rには、「feof」の定義が書かれています。
178 K&Rでは、 "_fillbuf"の定義に赤いアンダースコアが付いている2つの条件が反対であると思います。
私はそうですか?
私はK & R(第2版)の新しいミスを発見したと思います。正誤表に現れないK&R(第2版)の新しいミス?
164ページで、「ファイルの終了」が発生した場合、「feof」は0以外を返します。
170ページで、「ファイルの終わり」に達したときに「read」が0を返すと書かれています。
176 K&Rには、「feof」の定義が書かれています。
178 K&Rでは、 "_fillbuf"の定義に赤いアンダースコアが付いている2つの条件が反対であると思います。
私はそうですか?
Bjorn Aのcommentとlurkerのcommentの両方に同意します。コードに問題はありません。
p164のfeof()
の仕様は、C標準に言及していますが、私はPOSIX仕様にリンクしていますが、C標準と一致させることを意図しています。仕様は、が0
を返すとEOFを示し、 -1
が返された場合、単純にEOFではなくエラーが発生しました。それほど議論の余地はない。
p176の内容は、の実装feof()
であることに注意してください。 ではなく、の実装feof()
です。実際の結果とほとんど同じですが、これとは細部の異なる実装があります。
#define feof(p) (((p)->flag & _EOF) != 0)
マクロは例外ではありません。フラグに_EOF
ビットが設定されている場合は1
、それ以外の場合は0
が返されます。期待値(要件)を満たしています。
サンプル実装は_fillbuf()
のままです(p178)。関連するコードは次のとおりです。
fp->cnt = read(fp->fd, fp->ptr, bufsize); if (--fp->cnt < 0) { if (fp->cnt == -1) fp->flag |= _EOF; else fp->flag |= _ERR; fp->cnt = 0; return EOF; } return (unsigned char)*fp->ptr++;
考慮すべき3つのケースがあります。
read()
はread()
リターンがread()
が負の数最初のケースでは、コードはfp->cnt
をデクリメントし、少なくとも0
になるので、最終的なリターンが実行されます。文字が返され、unsigned char
に正しくキャストされ、値が正であることを確認します。第二の場合(EOF処理)において
、コードが-1
に0
からfp->cnt
をデクリメントし、そして外側if
ステートメントの体内に入ります。 fp->cnt
は現在-1
であるため、_EOF
ビットをfp->flag
に設定し、カウントをゼロに戻してEOF
と報告します。これは正しいです。第三のケース(エラー処理)で
は、コードが-1
-2
からfp->cnt
をデクリメントし、外側if
ステートメントの体内に入ります。 fp->cnt
は-1
ではないので、_ERR
ビットをfp->flag
に設定し、カウントをゼロに戻してEOF
と報告します。これも正しいです。
したがって、K & R第2版のコードは正しいです。これまでに報告されていないエラータは見つかりませんでした。
私によく見えます。 read()は0を返します。これはテストの前に-1に減らされます(--fp-> cnt <0)。したがって、read()が0を返す場合、fillbuf()はEOFを設定します。 fillbufのテストでは、read()は-1を返してエラーになります。 –
実際にあなたが見つけたと思われる問題について質問するかもしれませんが、実際にはその本を読む必要はありません。 –
@RetiredNinja OPは本の関連部分のコピーへの優れたリンクを掲載しました。 –