2016-04-30 70 views
2

我製作了這個簡單的C程序,其目的是對通過第二個命令行參數給出的文本文件中的字符進行計數。 我面對的問題是,fseek顯示沒有響應結果有一個無限循環(while(!feof(fp)))函數「計數器」。)用fgetc替換fseek該程序工作正常。我的問題fseek出了什麼問題。 在此先感謝。Fseek沒有設置流的文件位置C

#include <stdio.h> 

int Counter (FILE * fp); 

int main(int argc, char* argv[]) 
{ 
    int cntr; 
    FILE * fpc; 
    fpc = fopen(argv[1],"r"); 
    cntr = Counter(fpc); 
    fclose(fpc); 
    printf("%i\n",cntr); 
} 

int Counter (FILE * fp) 
{ 
    int cntr = 0; 
    while (!feof(fp)) 
    { 
     cntr++; 
     fseek(fp,1,1); 
    } 
    return cntr; 
} 
+1

使用常量「SEEK_CUR」而不是1,它使代碼更清晰。 – Matthieu

+0

我已經使用過它,結果相同 – Spyreto

+0

請參閱[爲什麼'while(!feof(file))總是出錯?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-總是錯誤的)。 –

回答

3

它是允許和明確定義的行爲,超越文件的結尾。

這就是爲什麼fseek()沒有設置文件結束指示符,它甚至會在成功時取消它的設置。

C Standard

5確定新的位置,一個成功的呼叫到FSEEK功能後[...]清除用於流的結束文件指示符,然後建立新的位置。

+1

好趕上!我已經看到了代碼,你可以在其中寫入一個字節,'fseek'進一步寫入1 GB,並寫入另一個字節,導致文件系統在256 MB磁盤上看到1 GB的文件。 – Matthieu