stdio.h


Función ungetc ANSI C

int ungetc(char c, FILE *stream);

Esta función envía el carácter especificado por c (convertido a un unsigned char) en el stream de entrada apuntado por stream. Los caracteres apilados serán retornados por lecturas posteriores en ese stream en orden inverso al que fueron apilados. Una llamada interventiva y correcta (con el stream apuntado por stream) a una función de posicionamiento de fichero (fseek, fsetpos, o rewind) descarta cualquier carácter apilado para el stream. El almacenamiento externo correspondiente al stream no varía.

Un carácter apilado es garantizado. Si la función ungetc es llamada demasiadas veces al mismo stream sin una lectura interventiva o una operación de posicionamiento de fichero en ese stream, entonces la operación falla. Si el valor de c es igual a la macro EOF, la operación falla y el stream de entrada no varía.

Una llamada exitosa a la función ungetc despeja el indicador de final de fichero para el stream. El valor del indicador de posición de ficheros para el stream después de leer o descartar todos los caracteres apilados será el mismo que era antes de que los caracteres fueran apilados. Para un stream de texto, el valor de su indicador de posición de ficheros después de una llamada exitosa a la función ungetc no es especificado hasta que todos los caracteres apilados sean leídos o descartados. Para un stream binario, el valor de su indicador de posición de ficheros es determinado por cada llamada exitosa a la función ungetc; si su valor era cero antes de la llamada, es indeterminado después de la llamada.

Valor de retorno:

La función ungetc retorna el carácter apilado después de la conversión. Si la operación falla, entonces retorna EOF.

Ejemplo:

#include <stdio.h>
#include <ctype.h>

int main( void )
{
   int i=0;
   char c;

   puts( "Escriba un numero entero seguido por un caracter:" );

   /* lee caracteres hasta uno que no sea un dígito o hasta un EOF */
   while( (c=getchar()) != EOF && isdigit(c) )
      i = 10 * i + c - 48;    /* convierte ASCII un valor entero (int) */

   /* Si se leyó un carácter que no era un d&ígito, apílalo en el stream de entrada */
   if( c != EOF )
      ungetc( c, stdin );

   printf( "i = %d, siguiente caracter en el stream = %c\n", i, getchar() );

   return 0;
}