2017-02-16 86 views
1

線的長度A prgram這裏的程序:,打印用C

#include <stdio.h> 
#define BUF_LEN 200 
#define LINE_NUMBER 3 

int line_len(char* filename, int n) 
{ 
    FILE* f; 
    char buf[BUF_LEN]; 
    int j, i = 0; 
    if ((f = fopen(filename, "r"))) 
    { 
     for (j = 0; j < n; j++) 
      fgets(buf, BUF_LEN, f); 
     for (i = 0; buf[i]; i++) /* find end of buf */ ; 
     fclose(f); 
    } 
    return i; 
} 

int main() 
{ 
    printf("%d\n", line_len("test.txt", LINE_NUMBER)); 
    return 0; 
} 

據我所知,功能line_len接收文件和我們感興趣的行號名稱它然後以只讀模式打開文件並迭代直到達到n行,通過每次迭代讀取文件f中的BUF_LEN-1個字符並將這些字符存儲在buf中。所以當第一個for循環中斷時,buf將包含第一個n行的所有字符。

我不明白需要第二個循環。它何時終止? 這個功能是如何工作的?如果在第一個循環的末尾buf將包含第一個n行的字符,那麼該函數如何返回該行的長度爲n

在此先感謝!

+0

你忘記了寫任何代碼行嗎? – Marievi

+0

代碼實際工作,對嗎? –

+2

第一個for循環將第n行的每個字符添加到buf數組中。第二個for循環計算buf數組(i)的長度並返回該數組。 – Forklift

回答

5

我不明白需要第二個循環。它何時終止?

第二個循環有buf[i]作爲其循環條件。只要buf[i]爲真即非零,它將繼續執行。所以當它到達行尾的nul字符時(由fgets()添加),循環將終止。

該功能如何工作?

簡單地說,它讀取n行。每一行都被放入緩衝區,以防止以前的行。在讀取n行之後,它從讀取第n行開始計算緩衝區中的字符。

雖然這是一段糟糕的代碼。 fgets呼叫沒有錯誤檢查,如果第n行有超過199個字符,它會給出錯誤的答案。事實上,如果考慮一條線的長度來排除換行符,它總會得到錯誤的答案。

如果文件的行數小於n行,則它也返回零,如果無法打開文件,則返回。如果讀取一行時發生錯誤,它將返回一個不確定的數字,如果它在文件末尾運行,則會返回最後一行的長度。

在這些情況下,錯誤結果會更好。

+0

@chux好的。在文件結束時,緩衝區保持不變並且在其他錯誤的情況下是「不確定的」。我會修改答案。 – JeremyP

+0

非常感謝!它覆蓋它,這使事情變得更清晰。只是兩件事情: 1-我怎麼能知道每一行覆蓋前一行,我的意思是我怎麼知道該行不會被添加到緩衝區? 2-如果第二個循環在遇到'\ 0'時立即終止,那麼在讀取第n-1行的第一個字符串而不是讀取整行之後它不會終止? – Tree

+0

@Tree Point 1閱讀[手冊頁](https://linux.die.net/man/3/fgets)。除非它說它附加到緩衝區,否則你總是可以假設它會覆蓋之前的內容。 – JeremyP