2014-10-08 50 views
0

所以我找不到這個問題的答案。fgetc不增加指針或減少fpos_t對象(C)

有兩種:

  1. 類似龜etc,在指針檢索字符,不增加指針的函數?

  2. 或者一種減少fpos_t對象而不減少指針下方的方法。 (在這個答案最感興趣)

對於C.

+2

這樣的事情? http://stackoverflow.com/a/2082772/535275 – 2014-10-08 00:47:38

+1

你指的是什麼''fpos_t'對象,什麼是「它下面的指針」,它們是如何區分的? – 2014-10-08 01:01:36

回答

3

你有三個選擇:

1)使用ftell/fseek

例子:

FILE * pFile; 
    char c1, c2; 
    long offset; 
    pFile = fopen ("example.txt" , "r"); 
    offset = ftell(pFile); 
    c1 = fgetc(pFile); 
    fseek (pFile , offset , SEEK_SET); 
    c2 = fgetc(pFile); 
    /* result: c1 == c2 */ 

(備註:對於二進制流,你也可以ry使用fseek(pFile, -1, SEEK_CUR),但是對於文本模式,正如所注意到的,獲取一個字符可能使指針超過一個位置)。

2)use fgetpos/fsetpos

實施例:

FILE * pFile; 
    fpos_t position; 
    char c1, c2; 
    pFile = fopen ("example.txt","r"); 
    fgetpos (pFile, &position); 
    c1 = fgetc(pFile); 
    fsetpos (pFile, &position); 
    c2 = fgetc(pFile); 
    /* result: c1 == c2 */ 

3)使用ungetc

FILE * pFile; 
    char c1, c2; 
    c1 = fgetc(pFile); 
    ungetc(c1, pFile); 
    c2 = fgetc(pFile); 
    /* result: c1 == c2 */ 

在以下這些方法中的一種將是更有效的,是與平臺和實現相關的。例如。例如,可能是在ungetc的引擎下,將重新讀取當前塊直到當前點。或者它可能只是將指針移動到內存緩衝區中。

+1

對於第一個例子,你想要使用'ftell'來確定'fgetc'之前的當前位置,然後反饋給'fseek'。從文本流中讀取單個字符可能會超過1個字節(例如,從一個字符中讀取換行符Windows文本文件返回''\ n'',但消耗''\ r''和''\ n'')。當然,它只在文件可搜索時才起作用;例如,不能倒退'stdin' – 2014-10-08 01:02:46

+0

確實會更新答案 – Ashalynd 2014-10-08 01:04:27

+1

請注意''ungetc()'有一些與文件定位函數相關的有趣屬性,仔細閱讀它的規範。 – 2014-10-08 01:13:31