ungetc() en C/C++

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:

  1. 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.
  2. Los bytes retrocedidos se devuelven mediante lecturas posteriores en ese flujo en el orden inverso al de su inserción.
  3. 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.
  4. El almacenamiento externo correspondiente al flujo no se modificará.
  5. Una llamada exitosa a ungetc() borra el indicador de fin de archivo para la secuencia.
  6. 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.
  7. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *