2017-02-28 10 views
0

次のCプログラムでは、下位のテキストファイルを印刷しますテキストファイルを逆方向​​に印刷するプログラムでオフセットの代わりに-2のオフセットを使用してfseekを呼び出す必要があるのはなぜですか?

#include <stdio.h> 
#define SEEK_SET 0 
#define SEEK_CUR 1 
#define SEEK_END 2 
int main(int argc, char **argv) 
{ 
    FILE *fp = f 
    open(argv[1], "r"); 
    fseek(fp, -1L, SEEK_END); 
    while (ftell(fp)) 
    { 
     putchar(fgetc(fp)); 
     fseek(fp, -2L, SEEK_CUR); 
    } 

putchar(fgetc(fp)); 

プログラムを逆テキストファイルを印刷することになっているので、それは任意の文字をスキップせず、端からそれぞれ、すべての文字を読むことになっています。もしそうなら、whileループ内の呼び出しは、

fseek(fp, -1L, SEEK_CUR); 

となるはずです。

ありがとうございます!

+3

fgetc()は1を前に移動したので、前に2に戻ってcharに到達する必要があります。 –

+0

シークすると、毎回同じ文字が表示されるためです。 –

+0

これは移植可能であることが保証されていません - テキストファイルは任意に "探し求める"ことはできません –

答えて

1

fgetcを呼び出すと、offsetは期待どおりの1文字分先になるので、2文字目に戻って取得したい文字を取得する必要があります。それ以外の場合は、常に同じcharを取得しています。

+0

ありがとうございました。 fgetcはキャラクタを返した後で1文字先に進んでいます。 @Luis Cabrero – Tree

+1

fgetcが成功しなかった場合は、EOF(ファイルの終わり)を返し、エラーを示すerrnoを設定します。したがって、charが返された場合に限り、1文字先に進みます。あなたが後ろに行くなら、これは起こるつもりはありません。 –

+1

ありがとうございました。実際には、私はまだ何かについてはわかりません:私のテキストファイルに文字列 "abcd"が含まれていると仮定した場合、fgetcは 'd'を返し、次にインジケータを1つ右に進め、そこには何もありません。 fssekを呼び出すことによって2つのポジションに戻るので、文字は 'c'になります。次に、fgetcはインジケータを 'd'に進め、-2のオフセットを持つfeekへの呼び出しが行われるので、今度は 'b'という文字が印刷されます。 @Luis Cabrero – Tree

関連する問題