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

 
Accés aleatori a un fitxer

En aquesta pràctica escriurem en un fitxer binari i en la pràctica d'ampliació 2  llegirem les dades gravades

 

Desenvolupament de la pràctica

Hi ha casos en els quals es necessària tant la lectura com l'escriptura de manera seqüencial. Es dir, s'obre l'arxiu des de el començament i es van llegint o escrivint les dades des de l'inici fins al final, seqüencialment.

En molts casos aquest accés ens pot servir. Llegim el contingut complert del fitxer i treballem amb ell. Obríem el fitxer per escriure els resultats i els anem gravant tots seguits.

Hi ha casos que necessitem accedir un i altre cop al fitxer per llegir les dades, modificar-les i desar les modificacions en la seva posició.

Creeu un nou arxiu del tipus C++ anomenat m8p1.cc i escriviu el següent codi:

//m8pa1.cc - Escriure registres
#include <stdio.h>
#include <string.h>

typedef struct {
    char nom[20];
    int edat;
} persona;

int main()
{
   FILE *f1;
   persona dada;
   int i;

   /* Abrimos el fichero binario y de escritura */
   f1 = fopen ("alumnes.dat", "wb");
   if (f1 == NULL)
   {
     perror("No es pot obrir alumnes.dat");
     return -1;
   }

   // Desem 10 registres
   // Alumne0, Alumne2, Alumne3, ..., Alumne9
   // edats 0, 2, 4, ... 18

   for (i=0; i<10; i++)
   {
      sprintf (dada.nom, "Alumne%d", i);
      dada.edat=i*2;
     // gravem un registre
     fwrite (&dada, sizeof(dada), 1, f1);
   }


   fclose(f1);

   return 0;
}

 

 Explicació del programa

Obriem el fitxer binari amb mode escriptura fopen ("alumnes.dat", " wb")  i gravem 10 registres del tipus persona. Utilitzem la funció sprintf en el següent bucle:
   for (i=0; i<10; i++)
   {
      sprintf (dada.nom, "Alumne%d", i);
      dada.edat=i*2;
     // gravem un registre
     fwrite (&dada, sizeof(dada), 1, f1);
   }
 

int sprintf (char *cadena, const char *format, arguments)  dona format d'acord al segon i tercer arguments i guarda aquest resultat en cadena. El format consisteix en caràcters normals i té la mateixa forma i funció que els arguments de printf.