2017-07-29 3 views
1

私はK & R(第2版)の新しいミスを発見したと思います。正誤表に現れないK&R(第2版)の新しいミス?

  • 164ページで、「ファイルの終了」が発生した場合、「feof」は0以外を返します。

  • 170ページで、「ファイルの終わり」に達したときに「read」が0を返すと書かれています。

  • 176 K&Rには、「feof」の定義が書かれています。

  • 178 K&Rでは、 "_fillbuf"の定義に赤いアンダースコアが付いている2つの条件が反対であると思います。

私はそうですか?

+2

私によく見えます。 read()は0を返します。これはテストの前に-1に減らされます(--fp-> cnt <0)。したがって、read()が0を返す場合、fillbuf()はEOFを設定します。 fillbufのテストでは、read()は-1を返してエラーになります。 –

+0

実際にあなたが見つけたと思われる問題について質問するかもしれませんが、実際にはその本を読む必要はありません。 –

+1

@RetiredNinja OPは本の関連部分のコピーへの優れたリンクを掲載しました。 –

答えて

8

Bjorn Acommentlurkercommentの両方に同意します。コードに問題はありません。

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処理)において

、コードが-10から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版のコードは正しいです。これまでに報告されていないエラータは見つかりませんでした。

関連する問題