Enrere Mòdul 8
Fonaments de Programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 

Lectura i escriptura de dades formatades. Les funcions fprintf() i fscanf()

En aquesta pràctica la lectura i l'escriptura es farà mitjançant les funcions fprintf() i fscanf() que permeten fer servir alhora diferents tipus de dades a més de donar-li un format específic a les dades.

 

Desenvolupament de la pràctica

Les funcions fprintf() i fscanf() es comporten igual que les funcions printf() i scanf() excepte pel fet que necessiten un argument addicional per apuntar a l'arxiu corresponent. El format general és:

int fprintf(punter_arxiu,"cadenadecontrol",llistad'arguments);

   int fscanf (punter_arxiu,"cadena de control",llista d'arguments);

 

La funció fprintf() retorna el nombre de caràcters enviats a l'arxiu. Si es produeix un error retorna un número negatiu.

La funció fscanf() retorna el nombre d'elements que ha pogut emparellar. Quan arriba al final de l'arxiu retorna la constant EOF.

Aquestes funcions són especialment importants quan es vol llegir o escriure dades de diferents tipus. El següent programa és un bon exemple d'això:

Creeu un nou arxiu del tipus C anomenat m8p03.c i escriviu el següent codi:

// m8p03.c - Lectura i escriptura amb fprintf() i fscanf() -

#include <stdio.h>

int main(){

    FILE *f;
    int codi;
    char nom[20];
    char cognom[20];
    float nota;

    f = fopen ("prova.txt","w");


    printf("\n Introdueix les dades.");
    printf("\n posa 0 al codi per finalitzar\n");


    if (f!=NULL){
        do{


            printf("\nIntroduïu el codi...");
            scanf(" %d",&codi); if(codi==0) break;

            printf("Introduïu el nom... ");
            scanf(" %s",nom);
 
            printf("Introduïu el cognom...");
            scanf(" %s", cognom);

            printf("Introduïu la nota...");
            scanf(" %f",&nota);

          fprintf(f, "%d %s %s %f\n",codi, nom, cognom, nota);

         }while (1);

         fclose(f);
    }

    /* lectura */

    printf("\n\n************** lectura ************* \n\n");

    if ( (f = fopen ("prova.txt","r"))!=NULL){
        while (fscanf(f, "%d %s %s %f",&codi, nom,
                cognom, &nota) != EOF)
             printf("%d %s %s %f\n",codi, nom, cognom, nota);

        fclose(f);
    }

    return 0;
}

Captura de l'execució del programa.

 

 

 

 

Explicació del programa

En aquest programa es mostra una altra forma habitual d'obrir un arxiu amb la comprovació d'error pertinent. És necessari comprovar sempre que el punter retornat per la funció fopen() no sigui el punter NULL. En aquest cas la comprovació es fa d'aquesta forma:

 

   f = fopen ("prova.txt","w");

   ..........
   

   if (f!=NULL){

     ..............

Es pot comprovar que el funcionament de fprintf() és similar a printf(). Amb una funció scanf() es llegeix el valor de les variables codi, nom, cognom i nota i després s'escriu el contingut d'aquestes quatre variables a l'arxiu apuntat per f de la mateixa forma que es faria a la pantalla:

 
       fprintf(f, "%d %s %s %f\n",codi, nom, cognom, nota);

El procés d'escriure és exactament igual:

 
      while (fscanf(f, "%d %s %s %f",&codi, nom,
                cognom, &nota) != EOF)
             printf("%d %s %s %f\n",codi, nom, cognom, nota);

Mentre que la funció fscanf() no trobi el final de l'arxiu, es va llegint la informació en grups de quatre dades. Després s'escriu per pantalla el contingut de les variables.