2013-07-26 37 views
2
int main(int argc, char *argv[]) 
{ 
    int c = EOF; 
    FILE *fp = fopen("./temp.txt", "r"); 
    assert(fp!=NULL); 
    while (1) { 
     c = fgetc(fp); 
     if (EOF != c) { 
      putchar(c); 
     } 
    } 

    return 0; 
} 

TEMP.TXT是一個緩慢增加的日誌文件,因此該程序可以讀取EOF。在第一次遇到EOF後,我認爲它應該停止獲取 temp.txt的新增數據,而它只是像tail -f temp.txt一樣行爲並繼續打印文件的新行。爲什麼這個節目表現得像'尾巴-f`

是的,我知道有一個無限循環。問題是,我認爲,當 龜etc首先遇到EOF,應該做一些記錄在struct FP, 和龜etc下一個召喚應該檢查這一點,並立即返回EOF。 爲什麼它會繼續讀取磁盤上的數據,是不是到達文件結尾? 這是預期的行爲?

+3

嘗試 '其他{打破;}' – Ishmeet

+0

更好地寫出:'而((C =龜etc(FP))= EFO! ){putchar(c);}' –

+1

你顯然是將你的程序與Glibc鏈接起來。如果你將它與uClibc鏈接起來,它會在EOF之後第一次調用fgetc時崩潰。 EOF之後的文件讀取未指定。 – andyn

回答

2

快速回答是,沒有break退出while循環。

當它顯示爲EOF時,它迴繞並保持在c = fgetc(fp);

如果你需要停止閱讀,當它擊中的EOF你可以添加一個else

while (1) { 
    c = fgetc(fp); 
    if (EOF != c) { 
     putchar(c); 
    } else { 
     // reached the EOF 
     break; 
    } 
} 
1

你沒有告訴它離開,雖然尋找一個EOF時while循環,你只說如果你確實找到了EOF,不要對它做任何事情。您需要從循環中放置一個條件中斷,或者有一個條件,直到while循環將繼續。

0
int main(int argc, char *argv[]) 
{ 
    int c = EOF; 
    FILE *fp = fopen("./temp.txt", "r"); 
    assert(fp!=NULL); 
    while (1) { // here 
     c = fgetc(fp); 
     if (EOF != c) { 
      putchar(c); 
     } 
    } 

    return 0; 
} 

這是因爲你有一個無法停止的死循環(有些信號除外)。該計劃將永久閱讀temp.txt

0
int main(int argc, char *argv[]) 
{ 
    int c = EOF; 
    FILE *fp = fopen("./temp.txt", "r"); 
    assert(fp!=NULL); 
    while (1) { 
     c = fgetc(fp); 
     if (EOF != c) { 
      putchar(c); 
     } 
     else 
      break; //this will fix your problem of infinite loop even finding EOF 
    } 

    return 0; 
} 
0

IMO它會更好看,當你做

int c = 0; 
while ((c = fgetc(fp)) != EOF) 
{ 
    putchar(c); 
} 
相關問題