std:: ungetc
|
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
|
|