La función ungetc() toma un solo carácter y lo vuelve a colocar en un flujo de entrada. Es lo opuesto a la función getc() , que lee un solo carácter de un flujo de entrada. Además, ungetc() es una función de entrada, no una función de salida.
Sintaxis:
int ungetc(int char, FILE *stream)
Parámetros:
- char : especifica la promoción int del carácter que se va a devolver. El valor se convierte internamente en un carácter sin firmar cuando se vuelve a colocar.
- stream : especifica el puntero a un objeto FILE que identifica un flujo de entrada.
Valor devuelto: la función devuelve dos tipos de valores.
- En caso de éxito, la función ungetc() devuelve el carácter ch.
- En caso de falla, se devuelve EOF sin cambiar el flujo.
Puntos importantes sobre la función:
- La función ungetc() empuja el byte especificado por char (convertido a un char sin firmar) de regreso al flujo de entrada al que apunta stream.
- Los bytes retrocedidos se devuelven mediante lecturas posteriores en ese flujo en el orden inverso al de su inserción.
- Una llamada intermedia exitosa (con el flujo apuntado por flujo) a una función de posicionamiento de archivos (fseek(), fsetpos() o rewind()) descarta cualquier byte retrasado para el flujo.
- El almacenamiento externo correspondiente al flujo no se modificará.
- Una llamada exitosa a ungetc() borra el indicador de fin de archivo para la secuencia.
- El valor del indicador de posición de archivo para el flujo después de leer o descartar todos los bytes retrocedidos será el mismo que era antes de que se retrocedieran los bytes.
- El indicador de posición del archivo disminuye con cada llamada exitosa a ungetc(), si su valor era 0 antes de una llamada, su valor no se especifica después de la llamada.
Los siguientes programas ilustran la función anterior.
Programa 1:
#include <stdio.h> int main() { FILE* f; int char; char buffer[256]; // read a file f = fopen("use1.txt", "r"); // when no data if (f == NULL) { printf("Error in opening file"); return (-1); } // read lines till end while (!feof(f)) { // get line char = getc(f); // replace ! with + if (char == '!') { ungetc('+', f); } // if not else { ungetc(c, f); } fgets(buffer, 255, f); fputs(buffer, stdout); } return 0; }
Supongamos que tenemos un archivo de texto use1.txt, que contiene los siguientes datos. Este archivo se usará como entrada para nuestro programa de ejemplo, luego la entrada y la salida se muestran a continuación:
Input: !c standard library !library function stdio.h-ungetc() Output: +c standard library +library function stdio.h-ungetc()
Programa 2:
// C program for taking input till we // get 1 at the input #include <stdio.h> int main() { int ch; // reads characters from the stdin and show // them on stdout until encounters '1' while ((ch = getchar()) != '1') putchar(ch); // ungetc() returns '1' previously // read back to stdin ungetc(ch, stdin); // getchar() attempts to read // next character from stdin // and reads character '1' returned // back to the stdin by ungetc() ch = getchar(); // putchar() displays character putchar(ch); return 0; }
Publicación traducida automáticamente
Artículo escrito por Swati Bararia y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA