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

 
Lectura i escriptura amb les funcions fgets() i fputs()

En aquesta prąctica aprendrem a fer servir les funcions fgets() i fputs() que permeten llegir i escriure tota una cadena de carącters d'un arxiu o a un arxiu.

 

Desenvolupament de la prąctica

Les funcions fgets() i fputs() permeten llegir i escriure cadenes de carącters en els arxius prčviament oberts amb la funció fopen().

La sintaxi de la funció fgets() és:

char *fgets( char *cadena, int rang, FILE *punter_arxiu)

La funció fgets() retorna la cadena llegida en cas que la lectura hagi estat correcta, o bé NULL si no ha estat possible. El primer argument és un punter al lloc de destķ de la cadena que volem llegir. La lectura s’aturarą quan s’hagi llegit un total de rang-1 carącters o quan trobem el carącter de nova lķnia. Llavors, quan es dóna una d'aquestes dues condicions, fgets() afegeix el carącter '\0' (nul) de fi de cadena. Si la cadena que estem llegint finalitza amb el carącter de nova lķnia '\n', llavors la cadena contindrą el carącter de nova lķnia i després el finalitzador de cadena '\0' (nul).Si es produeix un error, la funció fgets() retornarą la constant de carącter NULL.

La funció fputs() té per sintaxi:

int fputs( char *str, FILE *punter_arxiu )

i tramet una cadena de carącters a l'arxiu apuntat pel punter punter_arxiu que és un punter de tipus FILE. Si es produeix un error, retorna la constant EOF de final d'arxiu. No afegeix el carącter de nova lķnia en la sortida. Retorna l'śltim carącter escrit o el carącter de final d’arxiu EOF().

Per practicar aquestes dues funcions, escriviu el següent codi:

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

// m8p02.cc - Lectura i escriptura amb fgets() i fputs() -

#include <stdio.h>
#include <string.h>

int main(){

    FILE *punter;
    char cadena[80];

    if (( punter = fopen ("fitxers.txt","w"))==NULL)
        puts("\nNo puc crear l'arxiu fitxers.txt");
    else{

       printf("Introduļu text de vąries lķnies.\n");
       printf("Una lķnia en blanc per acabar.\n");

     

       while (strlen(fgets(cadena,80,stdin))!=1){
           fputs(cadena,punter);
           fputs("\n",punter);
       }

       fclose(punter);
    }

// lectura 

    if (( punter = fopen ("fitxers.txt","r"))==NULL)
        puts("\nNo puc crear l'arxiu: fitxers.txt");
    else{
       while (fgets(cadena,80,punter) != NULL)
           printf("%s",cadena);
       fclose(punter);
    }

    return 0;
}

Captura de l'execució del programa.

 

 

Explicació del programa

En aquest cas hem fet servir una altra forma estąndard d'obrir un arxiu. Amb una sentčncia if...else detectem un possible error i si es detecta escriu a la pantalla el missatge corresponent i en cas contrari comenēa a llegir cadenes de carącters.

La lectura es fa amb la sentčncia:

 while (strlen(fgets(cadena,80,stdin))){
           fputs(cadena,punter);
           fputs("\n",punter);
       }

Aquesta és una sentčncia tķpica de C on es barregen funcions i expressions. La funció fgets() llegeix una cadena de l'entrada estąndard (teclat) i torna el seu argument si no hi ha hagut cap error, és a dir: strlen(fgets(cadena,80,stdin)) és equivalent a: strlen(cadena). La funció fgets() manté el carącter de nova lķnia (\n), per tant, si s'introdueix una cadena buida, strlen(fgets(cadena,80,stdin))) és igual a 1, i per tant surt del bucle while. Mentre la cadena no sigui buida, escriu el contingut de la cadena de carącters cadena en l'arxiu apuntat pel punter

Si volem que cada cadena diferent la posi en una lķnia diferent és necessari la lķnia:

           fputs("\n",punter);

jLa part de lectura es fa de forma similar, 

       while (fgets(cadena,80,punter) != NULL)
           printf("%s",cadena);
       fclose(punter);

La funció fgets() llegeix de l'arxiu apuntat per punter una lķnia o fins a 80 carącters i emmagatzema aquests carącters en la variable cadena. Aquesta lectura es fa mentre el valor retornat per la funció no sigui NULL. Aquesta circumstąncia es produirą si hi ha algun error o es troba al final de l'arxiu.