2016-04-30 13 views
2

私はこの第2のコマンドライン引数で指定されたテキストファイルの文字を数えることを目的としたこのシンプルなCプログラムを作成します。 私が直面している問題は、fseekが関数 "Counter"内で無限ループ(while(!feof(fp)))を持つ結果を返さないことを示しています.fseekをfgetcに置き換えても、プログラムは正常に動作します。 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

1の代わりに定数「SEEK_CUR」を使用すると、コードが明確になります。 – Matthieu

+0

私は同じ結果でそれを使用しました – Spyreto

+0

[なぜwhile(!feof(file))はいつも間違っていますか?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-常に間違っている)。 –

答えて

3

ファイルの終わりを超えて検索することは許可され、明確に定義されています。

だからこそ、fseek()は、ファイルの終わりのインジケータを設定していないため、成功するとそれをさらに無効にします。 C Standardから

:新しい位置を決定した後

5、fseek関数関数の呼び出しが成功すると、[...]は、ストリームのend-of-fileインジケータをクリアし、新しいを確立しますポジション。

+1

良いキャッチ!私はあなたが1バイトを書き込むことができるコードを見てきました。さらに、1ギガバイトのfseekを実行し、別のバイトを書き込んで、256 MBのディスクに1 GBのファイルが収まっていることをファイルシステムに導きました。 – Matthieu

関連する問題