Professional Documents
Culture Documents
Tema 3 - Fitxers - Apunts
Tema 3 - Fitxers - Apunts
TEMA 3: Fitxers
TEMA 3: Fitxers .................................................................................................................................. 1
4.1.-Concepte de fitxer ..................................................................................................................... 1
4.2.-Tipus de accés ........................................................................................................................... 1
4.3.-Fitxers binaris i fitxers de text. ............................................................................................. 2
4.4.-Fitxers lògics i fitxers físics ...................................................................................................... 2
4.5.-Processament d’un fitxer .......................................................................................................... 3
4.4.1.-Obertura del fitxer: ............................................................................................................ 3
4.5.2.-Operacions: ........................................................................................................................ 4
4.5.3.-Tancament del fitxer: ......................................................................................................... 4
4.5.4.-Lectura mitjançant get(). ............................................................................................... 7
4.5.6.- Pas de paràmetres. ............................................................................................................ 8
4.6. Fitxers binaris .......................................................................................................................... 10
4.1.-Concepte de fitxer
Totes les estructures de dades que hem vist fins ara utilitzen memòria principal. Açò té dos
limitacions importants:
1. Les dades desapareixen quan el programa acaba.
2. La quantitat de les dades no pot ser molt gran a causa de la limitació de la memòria principal.
Per això existeixen també estructures especials que utilitzen memòria secundària: els fitxers.
El fitxer és a més una estructura dinàmica, en el sentit que el seu grandària pot variar durant
l'execució del programa depenent de la quantitat de dades que tinga.
4.2.-Tipus de accés
A l'estar en memòria secundària, no tots els elements del fitxer són accessibles de forma immediata.
Només es pot accedir cada vegada a un únic element del fitxer, que es denomina finestra del fitxer.
Depenent de com es desplaça la finestra pel fitxer, podem distingir dos tipus d'accés:
• Accés seqüencial: La finestra del fitxer només pot moure's cap avant a partir del primer
element i sempre d'un en u.
• Accés directe: La finestra del fitxer es pot situar directament en qualsevol posició del fitxer.
És un accés semblant a l'utilitzat en els arrays.
L'accés directe sol ser més eficient, ja que per a llegir un dada no cal llegir abans tots els anteriors.
La raó per la qual hi ha l'accés seqüencial és que hi ha dispositius de memòria secundària que
només admeten accés seqüencial (com per exemple les cintes). A més, l'accés seqüencial s'utilitza
també en dispositius que admeten accés directe quan volem llegir els elements de forma seqüencial,
ja que este accés és més senzill.
Exemple:
ofstream f;
Esta sentència ens declara una variable (fitxer lògic) de tipus fitxer d’eixida.
Però esta variable, perquè ens siga d'utilitat ha d'estar associada amb un fitxer "real", és a dir, per un
fitxer reconegut pel sistema operatiu (per ex. " dades.txt") ja que al final serà el sistema operatiu
qui realitze l'escriptura o lectura d'eixe fitxer. Este fitxer és el que es denomina fitxer físic.
Per a relacionar el fitxer lògic amb el fitxer físic necessitem realitzar una operació d'obertura del
fitxer.
En C++ esta operació es realitza amb la instrucció open:
nom_fitxer_logic.open (nom_fitxer_fisic);
Exemple:
f.open("dades.txt");
Exemple:
f.open("dades.txt", ios::app);
Para saber si l’obertura del fitxer ha donat error s’usa l’operador ! aplicat al fitxer:
Exemple:
if (!f)
cout << "Error obrint el fitxer" << endl;
Esta condició s’ha de posar sempre que obrim un fitxer, ja que si hi ha hagut un error, no es podrà
realitzar cap operació sobre ell.
4.5.2.-Operacions:
Les operacions que es poden realitzar sobre un fitxer són exactament les mateixes que es poden
realitzar sobre cin (per a fitxers d'entrada) i cout (per a fitxers d'eixida). De fet cin i cout són
fitxers predefinits, que estan associats amb l'entrada estàndard i l'eixida estàndard del sistema
operatiu.
Exemple
Per a escriure el número 10 al fitxer f:
f << 10;
Per a escriure un string:
f << "Hola";
nom_fitxer_logic.close ();
Exemple:
f.close();
#include <fstream.h>
int main()
{
ofstream f;
int i;
Exemple: Programa per a llegir els 10 números del fitxer i mostrar-los per pantalla.
#include <fstream.h>
#include <iostream.h>
int main()
{
ifstream f;
int i, dada;
f.open("dades.txt");
if(!f)
cout << "Error obrint el fitxer" << endl;
else
{
for(i = 1; i <= 10; i++)
{
f >> dada;
cout << dada << endl;
}
f.close();
}
return 0;
}
No obstant això, el normal és que no sapiguem tots els elements que llegirem, sinó que volem llegir
fins que arribem al final del fitxer. Per a això es pot utilitzar un bucle while de la manera següent:
while (f >> dada)
cout << dada << endl;
Quan una instrucció per a llegir de fitxer acaba amb èxit, torna cert, i quan es produeix algun tipus
d'error (entre els que s'inclou arribar al final del fitxer), torna fals. D'esta manera, la instrucció
anterior llegirà, mentre siga possible, tots els números del fitxer.
Exemple: Programa per a llegir els números d’un fitxer i mostrar-los per pantalla.
#include <fstream.h>
#include <iostream.h>
int main()
{
ifstream f;
int dada;
f.open("dades.txt");
if(!f)
cout << "Error obrint el fitxer" << endl;
else
{
while(f >> dada)
cout << dada << endl;
f.close();
}
return 0;
}
Esta forma de llegir el fitxer es pot utilitzar amb qualsevol tipus de lectura amb >> i també amb
getline.
Si volem llegir el fitxer caràcter a caràcter, el més normal serà utilitzar el mètode get(), no obstant
això este no torna cert o fals per a saber si s'ha pogut llegir amb èxit, ja que ha de tornar el caràcter
que ha llegit. La forma de llegir un fitxer amb get() serà per tant lleugerament diferent de la que
hem vist.
Exemple: Programa per a llegir els caràcters d’un fitxer i mostrar-los per pantalla.
#include <fstream.h>
#include <iostream.h>
int main()
{
ifstream f;
char dada;
f.open("dades.txt");
if(!f)
cout << "Error obrint el fitxer" << endl;
else
{
dada = f.get();
while(!f.eof())
{
cout << dada << endl;
dada = f.get();
}
f.close();
}
return 0;
}
El mètode eof() és cert si la dada que hem llegit era un final de fitxer i fals en cas contrari. Per
aquesta raó cal llegir el caràcter i després comprovar si hem aplegat a final de fitxer.
Exemple: Programa per a llegir els números reals d’un fitxer i calcula la mitjana aritmètica.
#include <fstream.h>
#include <iostream.h>
int main(void)
{
ifstream f_dades;
f_dades.open("dades.txt");
if(!f_dades)
cout << "Error obrint el fitxer" << endl;
else
{
m = mitjanaAritmetica(f_dades);
f_dades.close();
cout << "mitjana aritmètica " << n << endl;
}
return 0;
}
suma = 0.0;
n = 0;
while (f>>dada)
{
suma = suma + dada;
n++;
}
if (n>0)
m = suma / n;
return (m);
}
En C++ la lectura en binari es realitza per mitjà del mètode read i l'escriptura per mitjà del
mètode write. En ambdós casos cal passar com a primer paràmetre un punter de tipus char a la
variable a llegir o escriure, i com a segona dada el nombre de bytes a llegir o escriure.
#include <fstream.h>
#include <iostream.h>
int main()
{
ifstream f;
int dada;
f.open("dades.bin");
if(!f)
cout << "Error obrint el fitxer" << endl;
else
{
while(f.read((char *)(& dato), sizeof(dada) ) )
cout << dada << endl;
f.close();
}
return 0;
}
#include <fstream.h>
#include <iostream.h>
int main()
{
ofstream f;
int i;
f.open("dades.bin");
if(!f)
cout << "Error obrint el fitxer" << endl;
else
{
for(i = 1; i <= 10; i++)
f.write((char *)(& i), sizeof(i) );
f.close();
}
return 0;
}