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 en C++

En aquesta pràctica veurem un exemple de com es pot escriure i llegir dades formatades amb les classes de C++.

 

Desenvolupament de la pràctica

Sense entrar en totes les subtileses de les entrades i sortides en C++, veurem un exemple senzill de com es pot obrir un arxiu, de com es pot escriure i llegir diferents tipus de dades i com es pot tancar un arxiu en C++.

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

// m8p07.cc - Lectura i escriptura de dades formatades en C++ -

#include <fstream>
#include <iomanip>
#include <iostream>

using namespace std;
int main(){

   int codi;
   char nom[20];
   char cognom[20];
   float nota;


   ofstream fo("prova.txt");


   cout<<"\n Introdueix les dades";
   cout<<"\n Posa 0 al codi per finalitzar\n";


   if (fo!=NULL){
      do{

           cout<<"\nIntroduïu el codi...";
           cin>> codi; if(codi==0) break;

           cout<<"Introduïu el nom... ";
           cin>>nom;

           cout<<"Introduïu el cognom...";
           cin>>cognom;

           cout<<"Introduïu la nota...";
           cin>>nota;


       fo<<codi<<'\n'<< nom<<'\n'<< cognom<<'\n'<< nota<<'\n';

      }while (1);

      fo.close();
   }

/* lectura */

cout<<"**************** lectura *************** \n\n";

ifstream fi("prova.txt");

   if (fi){
      do{
           fi>>codi>> nom>> cognom>> nota;
           if(!fi.eof()){
              cout<<codi
              <<setw(20)<< nom
              <<setw(20)<< cognom
              <<setw(5)<<nota<<endl;
           }
        }while(!fi.eof());

        fi.close();
   }
   return 0;
}

 

Captura de l'execució del programa.

Explicació del programa

En primer lloc es pot comprovar que l'arxiu de capçalera propi de C++ ja no és stdio.h sinó fstream.h. Si també es vol fer servir manipuladors de sortida com setw, s'ha d'incloure l'arxiu iomanip.h

Amb la línia:
ofstream fo("prova.txt");

s'obre un objecte de la classe ofstream anomenat fo. Aquest objecte és l'equivalent C del punter que torna la funció fopen quan obrim un arxiu d'escriptura. Amb aquesta definició ja s'ha obert l'arxiu.

Per tal de detectar qualsevol error d'obertura de l'arxiu es fa una comprovació de l'objecte fo.:

 
 if (fo!=NULL){

....

L'escriptura de les diferents dades en l'arxiu es fa amb la següent sentència:

 
 fo<<codi<<'\n'<< nom<<'\n'<< cognom<<'\n'<< nota<<'\n';

que és similar a les sortides per pantalla pròpies de C++ canviant l'objecte cout per l'objecte creat fo.

Per tancar l'arxiu es crida a la funció membre close() de la següent forma:

 
  fo.close();

En la següent imatge teniu un exemple de la recollida de dades.

La recuperació de les dades del fitxer es fa de forma similar a com es recuperaria de l'entrada estàndard o teclat canviant l'objecte cin per l'objecte fi:

 
   fi>>codi>> nom>> cognom>> nota;

Una vegada que tenim el contingut de les dades en memòria es pot imprimir en la pantalla amb ajuda de l'objecte cout:

 
                  cout<<codi
                      <<setw(20)<< nom
                      <<setw(20)<< cognom
                      <<setw(5)<<nota<<endl;

El manipulador setw() indica el nombre d'espais que ocuparà en pantalla el valor imprès de la variable que s'indica a continuació. 

L'escriptura de dades es produeix fins que troba el final de l'arxiu, és a dir, fins que fi.eof() sigui veritat.

Per obrir l'arxiu per llegir dades, es defineix un objecte de la classe ofstream de la següent forma:

 
ifstream fi("prova.txt");

La lectura de les dades produeix una sortida com la següent: