Spec-Zone.ru › C

ungetc

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

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

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

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

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

Успешное выполнение ungetc очищает флаг конца файла feof.

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

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

Параметры

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

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

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

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

Примечания

Размер буфера для возврата символов на практике варьируется от 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'

Ссылки

  • Стандарт 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/w/c/io/ungetc

Spec-Zone.ru

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