2016-11-16 5 views
-1

私はfgetcと文字カウント方法を使って文字ファイルをループし、逆の順序で返します。試してみると2つの予期しないことが起こります。ループの2番目の反復を最初のものの下に貼り付けると、それは非常に異なった不吉な結果を返します。同様に、最初のループは最初に追加の文字を除いて正しい結果を返します。fgetcが間違った結果を返すループ

たとえば、ファイルに 'Hello'という文字列が含まれている場合、最初の反復は5olleHと2番目のHeHeHeHeHeHeHeHeHeHeHeHeHeHeを返します。両方のループで正しい結果がolleHになります。ここで

コードです:

FILE *file = fopen(argv[1], "r");  
count = count_characters(file); 
int originalCount = count; 

while(count){ 

ch = fgetc(file); 
printf("%c", ch); 
fseek(file, -2L, 1); // shifts the pointer to the previous character 
count--; 

} 

count = originalCount; 

while(count){ 

ch = fgetc(file); 
printf("%c", ch); 
fseek(file, -2L, 1); // shifts the pointer to the previous character 
count--; 

} 
+2

'fseek'を使ってファイルの位置を正しく設定する必要があります。 – interjay

+1

SEEK_CURの代わりに1を使用しているのはなぜですか?同じでも読みにくいのはなぜですか? –

+1

@KeineLustこれは、[コードOPコピー元](http://www.studytonight.com/c/program-to-reverse-content-of-file.php)が使用したものです。 OPでは、コードをコピーして他の人がそれを修正することを期待するのではなく、コードが何をするのかを理解しようとする。 – interjay

答えて

0

それは、物事がcount_charactersによってで残っているものを状態は明らかではありません()。また、最初のループの終わりに、ファイルの先頭に来る必要があります(実際には前にあります)。 2番目のループでは、後ろ向きに移動し続けます。

私はバッファサイズを設定し、バッファからファイルを読み込みます。小さなファイルの場合は、全体を読んでください(アルゴリズムはバッファよりも小さいファイルを考慮する必要があります)。それは私にとってはより簡単に思えるでしょう。

関連する問題