2017-02-28 44 views
0

下面的C程序打印的文本文件向後:爲什麼在程序中向後打印文本文件時,fseek的偏移量是-2,而不是偏移量-1?

#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); 

爲什麼偏移是-2而不是-1?

提前致謝!

+3

fgetc()將它向前移動1,所以你必須返回2才能到達之前的char。 –

+0

因爲尋找-1會每次向你顯示相同的字符。 –

+0

這不保證是便攜式 - 文本文件不能被任意「尋找」 –

回答

1

當你調用fgetc時,偏移量比你期望的要多1個字符,所以你需要移回2來獲得你期望得到的字符。否則,你會一直得到相同的字符。

+0

非常感謝。 fgetc只有在返回字符後纔會提前1個字符,對嗎? @Luis Cabrero – Tree

+1

如果fgetc不成功,它會返回EOF(文件結束),並設置errno來指示錯誤。所以,是的,只有當字符被返回時,它纔會提前1個字符。如果你倒退,這不會發生。 –

+1

非常感謝。實際上,我仍然不確定一些事情:假設我的文本文件包含字符串「abcd」,那麼fgetc將返回'd',然後將指示器向右推進1個位置,並且沒有任何內容。然後將通過調用fssek來倒退2個位置,所以角色將是'c'。然後fgetc會將指標提前到'd',然後調用feek以-2的偏移量進行,所以現在字符'b'被打印出來,等等....我是對的嗎? @Luis Cabrero – Tree

相關問題