2017-02-19 30 views
0
/ * fgets:  get at most n chars from iop */

char * fgets(char * s, int n, FILE * iop) 
{ 
    register int c; 
    register char * cs; 
    cs = s; 
    while (-n > 0 && (c = getc(iop)) != EOF) 
     if ((* cs++ = c) == ′\n′) 
      break; 
    *cs = ′\0′; 
    return (c == EOF && cs == s) ? NULL : s; 
} 

はなぜCS == sの私の質問は、return文では、してください。 fgetsはファイルの終わりやエラーが発生した場合にNULLを返すことになっているので、return文が返されないのはなぜですか(c == EOF)? NULL:s;fgetsのC標準ライブラリ関数

getcはまた、ファイルiopがポイントする文字を一度に読み取るc標準ライブラリ関数です。関数fgetsは、ファイルiopが指し示す行を読み込み、文字列sに格納されている行の読み込みが成功すれば、それを返します。ファイルの終わりに遭遇した、またはエラーが

+0

getcはまた、ファイルiopがポイントする文字を一度に読み取るc標準ライブラリ関数です。関数fgetsは、ファイルiopが指し示す行を読み込み、文字列sに格納されている行の読み込みが成功すれば、それを返します。ファイルの終わりが見つかった場合、またはエラーが発生した場合はNULLを返します。 – Evan

答えて

2

がなぜcs != sならば、明らかにいくつかのバイトが正常に終了する前に読んだだけでreturn (c == EOF) ? NULL : s;

のでreturn文ではありません

歓声を発生した場合、NULLを返します-of-fileまたはエラーが発生しました。fgets()がファイルの最後に到達する前に何かを正常に読み取った場合は、NULLを返すのは明らかに間違っています。

+0

これはc本(K&R)のprogammingからの行です - 通常fgetsは行を返します。ファイルの終わりまたはエラーでNULLを返します。本書によると、上記のfgetsの実装は、標準ライブラリ – Evan

+0

からコピーされています。これは、Cの本(K&R)のprogammingからの行です。通常、fgetsは行を返します。ファイルの終わりまたはエラーでNULLを返します。上記のfgets実装の本によれば、標準ライブラリからコピーされています。したがって、c == EOF && cs!= sの場合、sが返されます。しかし、c == EOF – Evan

+0

@ user3856947:はい、そうです。これは、ファイルの最後の文字が改行文字でない場合、ファイルの最後の行を読み込むたびに発生します。そのような場合、 'fgets()'は最後の行を読み込み、ファイルの終わりに達した後、最後の行を返します。それはどのように動作するはずです。このように動作しなかった場合、そのようなファイルの最後の行を読むことはできません。ファイルが変更されていないと仮定した場合、ファイルの最後にまだ残っているでしょうが、今は読み込むデータがないので、* f * NULL ' –

関連する問題