ungetc
, ungetwc
Vuelve a insertar un carácter en el flujo.
Sintaxis
int ungetc(
int c,
FILE *stream
);
wint_t ungetwc(
wint_t c,
FILE *stream
);
Parámetros
c
Carácter que se va a devolver.
stream
Puntero a la estructura FILE
.
Valor devuelto
Si la operación se realiza correctamente, cada una de estas funciones devuelve el argumento de carácter c
. Si c
no se puede volver a insertar o si no se ha leído ningún carácter, el flujo de entrada no cambia y ungetc
devuelve EOF
; ungetwc
devuelve WEOF
. Si stream
es NULL
, se invoca el controlador de parámetros no válidos, tal y como se describe en Validación de parámetros. Si la ejecución puede continuar o EOF
WEOF
se devuelve y errno
se establece en EINVAL
.
Para información sobre estos y otros códigos de error, consulte errno
, _doserrno
_sys_errlist
y _sys_nerr
.
Comentarios
La función ungetc
vuelve a insertar el carácter c
en stream
y borra el indicador de fin de archivo. El flujo debe estar abierto para lectura. Una operación de lectura posterior en stream
comienza con c
. Los intentos de insertar EOF
en el flujo mediante ungetc
se omiten.
Los caracteres que ungetc
pone en el flujo se podrían borrar si se llama a fflush
, fseek
, fsetpos
o rewind
antes de que se lea el carácter del flujo. El indicador de posición de archivo tendrá el valor que tenía antes de que se volvieran a insertar los caracteres. El almacenamiento externo correspondiente al flujo no cambia. Si una llamada de ungetc
en un flujo de texto se realiza correctamente, el indicador de posición del archivo está sin especificar hasta que se leen o se descarten todos los caracteres que se han vuelto a insertar. En cada llamada correcta de ungetc
en un flujo binario se reduce el indicador de posición de archivo. Si el valor era 0 antes de una llamada, el valor queda sin definir después de la llamada.
Los resultados son imprevisibles si se llama a ungetc
dos veces sin que haya una operación de lectura o de posición de archivo entre las dos llamadas. Después de una llamada a fscanf
, se puede producir un error en una llamada a a ungetc
menos que se haya realizado otra operación de lectura (por getc
ejemplo, ), ya que fscanf
a sí misma llama a ungetc
.
ungetwc
es una versión con caracteres anchos de ungetc
. Sin embargo, en cada llamada correcta de ungetwc
en un flujo de texto o binario, el valor del indicador de posición de archivo no se especifica hasta que se leen o se descartan todos los caracteres que se han vuelto a insertar.
Estas funciones son seguras para subprocesos y bloquean los datos confidenciales durante la ejecución. Para consultar una versión que no sea de bloqueo, vea _ungetc_nolock
, _ungetwc_nolock
.
De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.
Asignaciones de rutinas de texto genérico
Rutina TCHAR.H | _UNICODE y _MBCS no definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_ungettc |
ungetc |
ungetc |
ungetwc |
Requisitos
Routine | Encabezado necesario |
---|---|
ungetc |
<stdio.h> |
ungetwc |
<stdio.h> o <wchar.h> |
La consola no se admite en las aplicaciones de la Plataforma universal de Windows (UWP). Los identificadores de flujo estándar asociados a la consola, stdin
, stdout
y stderr
, se deben redirigir antes de que las funciones en tiempo de ejecución de C puedan usarlos en aplicaciones para UWP. Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Ejemplo
// crt_ungetc.c
// This program first converts a character
// representation of an unsigned integer to an integer. If
// the program encounters a character that is not a digit,
// the program uses ungetc to replace it in the stream.
//
#include <stdio.h>
#include <ctype.h>
int main( void )
{
int ch;
int result = 0;
// Read in and convert number:
while( ((ch = getchar()) != EOF) && isdigit( ch ) )
result = result * 10 + ch - '0'; // Use digit.
if( ch != EOF )
ungetc( ch, stdin ); // Put nondigit back.
printf( "Number = %d\nNext character in stream = '%c'",
result, getchar() );
}
521aNumber = 521
Next character in stream = 'a'