ungetc
|
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) |
|
|
C++ documentation
para
ungetc
|
|