|
Desenvolupament de la pràctica
Creeu un nou arxiu del tipus C++ anomenat m8p2.cc i escriviu el
següent codi:
//m8pa2.cc - llegir i escriure
resgistre
#include <stdio.h>
// prototipus de les funcions
void lectura_tot_arxiu();
typedef struct {
char nom[20];
int edat;
} persona;
FILE *f1;
persona dada;
int main()
{
int nombreRegistres;
// Obriem l'arxiu per lectura i escriptura
f1 = fopen ("alumnes.dat", "rb+");
if (f1 == NULL)
{
perror("No es pot obrir alumnes.dat");
return -1;
}
//Obtenim el total de resgistres que hi ha en el fitxer
fseek(f1, 0, SEEK_END);
nombreRegistres = ftell(f1)/sizeof(dada);
printf ("\n Dins el fitxer hi ha %d resgistres \n",nombreRegistres);
// Portem el cursor al cinquè registre, index 4
fseek (f1, 4*sizeof(dada), SEEK_SET);
// Mostrem la informació
fread (&dada, sizeof(dada), 1, f1);
printf ("nom = %s\n", dada.nom);
printf ("edat = %d\n", dada.edat);
//Modifiquem les dades de l'estructura
printf("\n Introduïu un nou nom ");
scanf("%s",dada.nom);
printf("\n Introduïu la nova edat ");
scanf("%d",&dada.edat);
// Ens situem a l'inici del registre 5
fseek(f1, 4*sizeof(dada), SEEK_SET);
// escribim damunt
fwrite (&dada, sizeof(dada), 1, f1);
fclose(f1);
//lectura de tot l'arxiu per comprovar els canvis
lectura_tot_arxiu();
return 0;
}
void lectura_tot_arxiu()
{
f1 = fopen ("alumnes.dat", "rb+");
if (f1 == NULL)
{
perror("No es pot obrir alumnes.dat");
return;
}
while(fread (&dada, sizeof(dada), 1, f1))
printf("\n nom %s edat %d",dada.nom,
dada.edat);
}
Captura de l'execució del programa.
 |
Explicació del programa
La funció fseek() ens permet desplaçarnos ràpidament
sense la necessitat d'anar llegint sequncialment el fitxer fins una posicio
determinada. Aixó és el que es coneix com acces aleatori.
Obtenim el total de registres que hi ha en el fitxer
amb el següent codi:
fseek(f1, 0, SEEK_END);
nombreRegistres = ftell(f1)/sizeof(dada);
Utilitzem fseek() que ens ermet moure el
cursor a una posició determinada del fitxer. En aquest cas el portem al final
del fitxer ( SEEK_END ). ftell () retorna la posició, en bytes,
del punter respecte a l'inici. El retorn d'aquest funció el dividim per la
grandària de cada registre i tenim el nombre de registres que tenim dins
el fitxer. Volem modificar el cinquè
registre. EL primer que hem de fer és calcular en quin byte comença aquest
registre. Això és fàcil. Cada registre té una grandària en bytes de
sizeof(dada) . El primer comença en un desplaçament de 0 bytes, el segon
sizeof(dada), el tercer en 2*sizeof(dada), i així
successivament. El nostre registre és 4*sizeof(dada),
ja que es comença a contar per zero.
fseek (f1, 4*sizeof(dada),
SEEK_SET);
Llegim i mostrem la informació
fread (&dada,
sizeof(dada), 1, f1);
printf ("nom = %s\n", dada.nom);
printf ("edat = %d\n", dada.edat);
Modifiquem les dades de l'estructura
//Modifiquem les dades de l'estructura
printf("\n Introduïr un nou nom ");
scanf("%s",dada.nom);
printf("\n Introduïr la nova edat ");
scanf("%d",&dada.edat); Ens
desplaçament amb SEEK_SET des de el començament del fitxer a la posició 4*sizeof(dada)
i sobreescribim.
fseek(f1, 4*sizeof(dada), SEEK_SET);
fwrite (&dada, sizeof(dada), 1, f1);
fclose(f1);
Per últim llegim tot el fitxer
per comprovar que la modificació s'ha realitzat.
void lectura_tot_arxiu()
{
f1 = fopen ("alumnes.dat", "rb+");
if (f1 == NULL)
{
perror("No es pot obrir alumnes.dat");
return;
}
while(fread (&dada, sizeof(dada), 1, f1))
printf("\n nom %s edat %d",dada.nom,
dada.edat);
}
|
|