scanf() y fscanf() en C

En lenguaje C, la función scanf() se usa para leer la entrada formateada desde stdin. Devuelve el número entero de caracteres escritos en él, de lo contrario, devuelve un valor negativo.

Sintaxis:

int scanf(const char *characters_set)

Muchos de nosotros conocemos los usos tradicionales de scanf. Bueno, estos son algunos de los hechos menos conocidos.

¿Cómo leer solo una parte de la entrada que necesitamos?  
Por ejemplo, considere algún flujo de entrada que contenga solo caracteres seguidos de un número entero o un flotante. Y necesitamos escanear solo ese número entero o flotante. 

Ejemplo:

Input: "this is the value 100", 
Output: value read is 100
Input : "this is the value 21.2", 
Output : value read is 21.2 

C

// C program to demonstrate that
// we can ignore some string
// in scanf()
#include <stdio.h>
int main()
{
    int a;
    scanf("This is the value %d", &a);
    printf("Input value read : a = %d", a);
    return 0;
}
// Input  : This is the value 100

Ahora, suponga que no sabemos cuáles son los caracteres anteriores, pero seguramente sabemos que el último valor es un número entero. ¿Cómo podemos escanear el último valor como un número entero? 

La siguiente solución funciona solo si la string de entrada no tiene espacios. Por ejemplo,

Aporte

"blablabla 25"

C

// C program to demonstrate use of *s
#include <stdio.h>
int main()
{
    int a;
    scanf("%*s %d", &a);
    printf("Input value read : a=%d", a);
    return 0;
}

Producción

Input Value read : 25

Explicación : el %*s en scanf se usa para ignorar algunas entradas según sea necesario. En este caso, ignora la entrada hasta el siguiente espacio o nueva línea. De manera similar, si escribe %*d, ignorará los enteros hasta el siguiente espacio o salto de línea. 

Uso general de scanf():

C

// C program to demonstrate general use of scanf()
#include <stdio.h>
int main()
{
    int a;
    scanf("%d", &a);
    printf("a = %d", a);
    return 0;
}

Aporte

2

Producción

a = 2

El hecho anterior puede no parecer un truco útil a primera vista. Para entender su uso, veamos primero fscanf().

Función fscanf en C

¿Cansado de toda la sintaxis torpe para leer archivos? bueno, fscanf viene al rescate. Esta función se usa para leer la entrada formateada de la secuencia dada en el lenguaje C. 

Sintaxis:

int fscanf(FILE *ptr, const char *format, ...) 

fscanf lee desde un archivo apuntado por el puntero FILE (ptr), en lugar de leer desde el flujo de entrada.

Valor devuelto: Devuelve cero, si no tiene éxito. De lo contrario, devuelve la string de entrada, si tiene éxito.

Ejemplo 1: considere el siguiente archivo de texto abc.txt 

NAME    AGE   CITY
abc     12    hyderbad
bef     25    delhi
cce     65    bangalore  

Ahora, queremos leer solo el campo de la ciudad del archivo de texto anterior, ignorando todos los demás campos. Una combinación de fscanf y el truco mencionado anteriormente hace esto con facilidad. 

C

// C Program to demonstrate fscanf
#include <stdio.h>
 
// Driver Code
int main()
{
    FILE* ptr = fopen("abc.txt", "r");
    if (ptr == NULL) {
        printf("no such file.");
        return 0;
    }
 
    /* Assuming that abc.txt has content in below
       format
       NAME    AGE   CITY
       abc     12    hyderabad
       bef     25    delhi
       cce     65    bangalore */
    char buf[100];
    while (fscanf(ptr, "%*s %*s %s ", buf) == 1)
        printf("%s\n", buf);
 
    return 0;
}

Producción

CITY
hyderabad
delhi
bangalore 

Ejemplo 2: considere el siguiente archivo binario program.bin

n1    n2    n3
1    5    6
2    10    11
3    15    16
4    20    21

Para leer todos los valores de n1, n2 y n3 del contenedor, usamos fscanf()

C

#include <stdio.h>
#include <stdlib.h>
 
struct threeNum{
    int n1, n2, n3;
};
 
int main(){
    int n;
    struct threeNum num;
    FILE *fptr;
    if ((fptr = fopen("program.bin","rb")) == NULL){
        printf("Error! opening file");
         // Program exits if the file pointer returns NULL.
         exit(1);
         }
     for(n = 1; n < 5; ++n){
         fread(&num, sizeof(struct threeNum), 1, fptr);
         printf("n1: %d\tn2: %d\tn3: %d", num.n1, num.n2, num.n3);
     }
     fclose(fptr);
     return 0;
}
 
//Code submitted by Susobhan Akhuli

Producción

n1: 1   n2: 5   n3: 6
n1: 2   n2: 10  n3: 11
n1: 3   n2: 15  n3: 16
n1: 4   n2: 20  n3: 21

Veamos las diferencias en forma tabular -:

  escanear() fscanf()
1. Se utiliza para leer la entrada estándar. Esta función se utiliza para leer la entrada de un archivo
2.

Su sintaxis es -:

scanf(const char *formato, …)

Su sintaxis es -:

fscanf(ARCHIVO *flujo, const char *formato, …)

3. Requiere especificadores de formato para recibir entradas de un tipo particular. Lee el flujo en forma de byte.
4.

Toma tres parámetros que son -:

Carácter de espacio en blanco , Carácter sin espacio en blanco , Especificadores de formato

Se define en el archivo de cabecera #include <stdio.h>

Este artículo es una contribución de Nikhil Chakravartula . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo en write.geeksforgeeks.org . Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *