Spec-Zone.ru › C++

std::ungetc

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

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

Операции перемещения по потоку std::fseek, std::fsetpos и std::rewind отменяют действие ungetc.

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

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

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

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

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

Параметры

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

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

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

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

Примечания

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

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

Пример

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

#include <cctype>
#include <cstdio>

void demo_scanf(const char* fmt, std::FILE* s)
{
    while (*fmt != '\0') {
        if (*fmt == '%') {
            switch (*++fmt) {
                case 'u': {
                    int c{};
                    while (std::isspace(c=std::getc(s))) {}
                    unsigned int num{};
                    while (std::isdigit(c)) {
                        num = num*10 + c-'0';
                        c = std::getc(s);
                    }
                    std::printf("%%u scanned %u\n", num);
                    std::ungetc(c, s);
                    break;
                }
                case 'c': {
                    int c = std::getc(s);
                    std::printf("%%c scanned '%c'\n", c);
                    break;
                }
            }
        } else {
            ++fmt;
        }
    }
}

int main()
{
    if (std::FILE* f = std::fopen("input.txt", "w+")) {
        std::fputs("123x", f);
        std::rewind(f);
        demo_scanf("%u%c", f);
        std::fclose(f);
    }
}

Вывод:

%u scanned 123
%c scanned 'x'

См. также

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

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

Spec-Zone.ru

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