2014-10-08 4 views
0

Так что я не смог найти ответ на этот вопрос.fgetc без приращения указателя ИЛИ уменьшение объекта fpos_t (C)

Есть либо:

  1. Функция аналогична fgetc, который извлекает символ по указателю, не увеличивающиеся указатель?

  2. ИЛИ способ уменьшения объекта fpos_t без уменьшения указателя под ним. (в основном заинтересованы в этом ответе)

Для C.

+2

Что-то вроде этого? http://stackoverflow.com/a/2082772/535275 –

+1

В каком объекте '' fpos_t' вы ссылаетесь, что такое «указатель под ним» и как они отличаются? –

ответ

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 */ 

(Замечание: для двоичного потока вы также можете t 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', например –

+0

Действительно, обновит ответ. – Ashalynd

+1

Обратите внимание, что 'ungetc()' имеет некоторые интересные свойства относительно функций позиционирования файла. Внимательно прочитайте его спецификацию. –