В C возможно ли прочитать символ из текущей позиции буфера getchar, не перемещая указатель буфера? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть файл, который был передан как stdin в моей программе.На каждой итерации очень большого цикла метод get_next вызывает getchar, получает следующий символ в stdin и присваивает его переменной с именем nchar.

Проблема в том, что у меня есть экземпляр, где я долженпосмотрите на символ после текущего nchar, не меняя того, что делает следующий вызов get_next.Это значит, что я должен вызывать getchar () без изменения состояния буфера.

Есть ли способ сделать это?Существует ли такой метод, как "getcharStatic", который возвращает следующий символ без изменения буфера, например, для поиска в стеке?

В качестве альтернативы, есть ли способ нормально читать символ с помощью getchar, а затем вставлятьchar прямо там, откуда я его взял, тем самым искусственно сохраняя состояние буфера?

Я некоторое время пытался поискать в гугле, и я думаю, что проблема связана со слишком расплывчатыми терминами и тегами.Спасибо за любую помощь!

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Вы можете использовать ungetc(), возможно, вот так:

int fpeekc(FILE *fp)
{
    int c = getc(fp);
    if (c != EOF)
        ungetc(c, fp);
    return c;
}

Тщательное чтение спецификации POSIX означает, что вы можете вызвать ungetc() с EOF, и вызов будетигнорируется, поэтому нет необходимости на 100% выполнять тест в функции fpeekc(), но он приводит к сбою ungetc() и возврату EOF.Если вам нравится жить - опасно или компактно;сделайте свой выбор - вы можете использовать:

int fpeekc(FILE *fp)
{
    return ungetc(getc(fp), fp);
}

И, если хотите, вы можете сделать это встроенной функцией.Если вы работаете в POSIX и хотите быть поточно-ориентированным, вы можете использовать:

int fpeekc(FILE *fp)
{
    flockfile(fp);
    int c = getc_unlocked(fp);  // Legitimate because of flockfile(); getc(fp) works too
    if (c != EOF)
    {
        // ungetc_unlocked() is not defined by POSIX but is available on
        // some but not all POSIX-like systems.  See comments below.
        ungetc(c, fp);
    }
    funlockfile(fp);
    return c;
}

, который предотвращает взаимодействие другого потока с потоком во время работы над ним.См. Также обсуждение с Номинальное животное в комментариях ниже.

И вы можете использовать:

static inline int peekc(void) { return fpeekc(stdin); }

, если вы хотите сделать это для стандартного ввода.

0 голосов
/ 23 октября 2018

Я думаю, что вы хотите int ungetc(int char, FILE *stream).Вы можете иметь метод:

char fgetputbackc(file *f){
    c = fgetc(f);
    ungetc(c, f);
    return c;
}
0 голосов
/ 23 октября 2018

Вы можете использовать ungetc(), чтобы вернуть персонажа обратно в стандартный ввод.Вот реклама из doc :

int ungetc( int ch, FILE *stream ); 

Если ch не равен EOF, вставляет символ ch (переосмысленный как unsigned char) во входной буфер, связанный с потокомпоток таким образом, что последующая операция чтения из потока будет извлекать этот символ.

...