Namespaces
Variants

std:: ungetc

From cppreference.net
< cpp ‎ | io ‎ | c
Definido en el encabezado <cstdio>
int ungetc ( int ch, std:: FILE * stream ) ;

Si ch no es igual a EOF , introduce el carácter ch (reinterpretado como unsigned char ) en el búfer de entrada asociado al flujo stream de tal manera que las operaciones de lectura posteriores de stream recuperarán ese carácter. El dispositivo externo asociado al flujo no se modifica.

Operaciones de reposicionamiento de flujo std::fseek , std::fsetpos , y std::rewind descartan los efectos de ungetc .

Si ungetc se llama más de una vez sin una lectura o reposicionamiento intermedio, puede fallar (en otras palabras, se garantiza un búfer de retroceso de tamaño 1, pero cualquier búfer más grande está definido por la implementación). Si se realizan múltiples llamadas exitosas a ungetc , las operaciones de lectura recuperan los caracteres retrocedidos en orden inverso al de ungetc

Si ch es igual a EOF , la operación falla y el flujo no se ve afectado.

Una llamada exitosa a ungetc borra el indicador de estado de fin de archivo std::feof .

Una llamada exitosa a ungetc en un flujo binario decrementa el indicador de posición del flujo en uno (el comportamiento es indeterminado si el indicador de posición del flujo era cero).

Una llamada exitosa a ungetc en un flujo de texto modifica el indicador de posición del flujo de manera no especificada, pero garantiza que después de que todos los caracteres devueltos sean recuperados con una operación de lectura, el indicador de posición del flujo sea igual a su valor antes de ungetc .

Contenidos

Parámetros

ch - carácter que se va a insertar en el búfer del flujo de entrada
stream - flujo de archivo al que se va a devolver el carácter

Valor de retorno

En caso de éxito ch es devuelto.

En caso de fallo EOF es devuelto y el flujo dado permanece sin cambios.

Notas

El tamaño del búfer de pushback varía en la práctica desde 4k (Linux, MacOS) hasta tan poco como 4 (Solaris) o el mínimo garantizado de 1 (HPUX, AIX).

El tamaño aparente del búfer de retroceso puede ser mayor si el carácter que se retrocede es igual al carácter existente en esa ubicación en la secuencia de caracteres externa (la implementación puede simplemente decrementar el indicador de posición del archivo de lectura y evitar mantener un búfer de retroceso).

Ejemplo

demuestra el uso de std::ungetc en su propósito original: implementar 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);
    }
}

Salida:

%u scanned 123
%c scanned 'x'

Véase también

obtiene un carácter de un flujo de archivo
(función)
Documentación C para ungetc