Namespaces
Variants

ungetc

From cppreference.net
< c ‎ | io
Definido en el encabezado <stdio.h>
int ungetc ( int ch, 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 con el flujo stream de tal manera que las operaciones de lectura posteriores desde stream recuperarán ese carácter. El dispositivo externo asociado con el flujo no se modifica.

Operaciones de reposicionamiento de flujo fseek , fsetpos , y 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 ungetc exitosos, 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 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 retrocedidos sean recuperados con una operación de lectura, el indicador de posición del flujo es 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 se devuelve 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 propósito original de ungetc : implementación de 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;
}

Salida:

%u scanned 123
%c scanned 'x'

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.21.7.10 La función ungetc (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.21.7.10 La función ungetc (p: 243)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.21.7.10 La función ungetc (p: 334)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.19.7.11 La función ungetc (p: 300)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.9.7.11 La función ungetc

Véase también

obtiene un carácter de un flujo de archivo
(función)