Spec-Zone.ru › C

ungetc

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

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

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

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

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

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

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

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

Параметры

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

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

В случае успеха возвращается ch.

В случае ошибки возвращается EOF, а переданный поток остаётся неизменным.

Примечания

Размер буфера возврата на практике варьируется от 4 КБ (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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/io/ungetc

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API