Namespaces
Variants

ungetc

From cppreference.net
< c ‎ | io
Определено в заголовочном файле <stdio.h>
int ungetc ( int ch, FILE * stream ) ;

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

Операции перепозиционирования потока fseek , fsetpos и rewind отменяют эффекты ungetc .

Если ungetc вызывается более одного раза без промежуточного чтения или изменения позиции, операция может завершиться неудачей (другими словами, гарантирован буфер возврата размером 1, но любой буфер большего размера определяется реализацией). Если было выполнено несколько успешных вызовов ungetc , операции чтения извлекают возвращённые символы в порядке, обратном порядку вызовов ungetc .

Если ch равен EOF , операция завершается неудачей и поток не изменяется.

Успешный вызов ungetc сбрасывает флаг состояния конца файла feof .

Успешный вызов ungetc для бинарного потока уменьшает индикатор позиции потока на единицу (поведение не определено, если индикатор позиции потока был равен нулю).

Успешный вызов ungetc для текстового потока изменяет индикатор позиции потока неопределённым образом, но гарантирует, что после извлечения всех возвращённых символов операцией чтения, индикатор позиции потока будет равен своему значению до вызова ungetc .

Содержание

Параметры

ch - символ для помещения обратно в буфер входного потока
stream - файловый поток, в который возвращается символ

Возвращаемое значение

При успешном выполнении ch возвращается.

При неудаче EOF возвращается, а заданный поток остается неизменным.

Примечания

Размер буфера pushback на практике варьируется от 4k (Linux, MacOS) до всего лишь 4 (Solaris) или гарантированного минимума 1 (HPUX, AIX).

Видимый размер буфера возврата может быть больше, если возвращаемый символ равен символу, существующему в этой позиции во внешней символьной последовательности (реализация может просто уменьшить индикатор позиции чтения файла и избежать поддержания буфера возврата).

Пример

Демонстрирует первоначальное предназначение ungetc : реализация scanf

#include <ctype.h>
#include <stdio.h>
void demo_scanf(const char* fmt, FILE* s)
{
    while (*fmt != '\0')
    {
        if (*fmt == '%')
        {
            int c;
            switch (*++fmt)
            {
                case 'u':
                    while (isspace(c=getc(s))) {}
                    unsigned int num = 0;
                    while (isdigit(c))
                    {
                        num = num*10 + c-'0';
                        c = getc(s);
                    }
                    printf("%%u scanned %u\n", num);
                    ungetc(c, s);
                    break;
                case 'c':
                    c = getc(s);
                    printf("%%c scanned '%c'\n", c);
                    break;
            }
        }
        else
            ++fmt;
    }
}
int main(void)
{
    FILE* f = fopen("input.txt", "w+");
    if (f != NULL)
    {
        fputs("123x", f);
        rewind(f);
        demo_scanf("%u%c", f);
        fclose(f);
    }
    return 0;
}

Вывод:

%u scanned 123
%c scanned 'x'

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.21.7.10 Функция ungetc (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.21.7.10 Функция ungetc (стр. 243)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.21.7.10 Функция ungetc (стр. 334)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.19.7.11 Функция ungetc (стр. 300)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.9.7.11 Функция ungetc

Смотрите также

получает символ из файлового потока
(функция)
C++ documentation для ungetc