2017-02-19 87 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 ==秒,在return語句。因爲fgets應該返回NULL,如果文件結束或發生錯誤,爲什麼不是return語句只是返回(c == EOF)? NULL:s;與fgets C標準庫函數

GETC,也是C標準庫函數,即讀入一個字符,在從文件IOP點的時間。函數fgets從文件iop指向的位置讀取一行,如果成功則返回讀取的行,存儲在字符數組s中。返回NULL,如果文件的末尾遇到或出現錯誤

歡呼

+0

GETC,也是C標準庫函數,即讀入一個字符,在從文件IOP點的時間。函數fgets從文件iop指向的位置讀取一行,如果成功則返回讀取的行,存儲在字符數組s中。返回NULL,如果文件的末端遇到,或發生錯誤 – Evan

回答

2

爲什麼不是return語句只是return (c == EOF) ? NULL : s;

因爲如果cs != s則顯然有些字節被成功地結束前閱讀-of文件或錯誤遇到,這將是明顯錯誤的fgets()返回NULL,如果它成功地到達文件結束前讀到的東西。

+0

這是一條線,從在C書預設電臺(K&R) - 通常FGETS返回線;在文件結尾或錯誤返回NULL。根據書,上面與fgets實施方式中,從標準庫 – Evan

+0

複製這是一條線,從預設電臺在C書(K&R) - 通常FGETS返回線;在文件結尾或錯誤返回NULL。根據這本書,上面的fgets實現是從標準庫複製的。所以如果c == EOF && cs!= s,s將被返回。但是c == EOF – Evan

+0

@ user3856947:是的,沒錯。如果文件的最後一個字符不是換行符,則每次讀取文件的最後一行時都會發生這種情況。在這種情況下,'fgets()'讀取最後一行,到達文件末尾,然後返回最後一行。這是它應該如何工作的。如果它不以這種方式工作,則永遠無法讀取此類文件的最後一行。在接下來的* *'時間與fgets()'叫,假設該文件還沒有改變,它仍然是在文件末尾,但現在不會有數據讀取,所以*那麼*將返回' NULL'。 –