You are on page 1of 11

Informàtica FACULTAT DE MATEMATIQUES

[ ] Departament d’Informàtica Tema 3


UNIVERSITAT DE VALENCIA
Departamento de Informática
Curs 2022-2023

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:

Tema 3: Fitxers 1/11


Informàtica FACULTAT DE MATEMATIQUES

[ ] Departament d’Informàtica Tema 3


UNIVERSITAT DE VALENCIA
Departamento de Informática
Curs 2022-2023

• 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.

4.3.-Fitxers binaris i fitxers de text.


Hi ha dos tipus principals de fitxers:
3. Fitxers de text: Contenen seqüències de caràcters separades per salts de línia. El teclat (entrada
estàndard) i la pantalla (eixida estàndard) es consideren també fitxers de text. Al llegir o escriure
variables d'un fitxer de text es poden realitzar certes conversions. Per exemple, quan escrivim
un sencer amb valor 10, este sencer es converteix en els caràcters '1' i '0'.
4. Fitxers binaris: Contenen seqüències d'elements d'un tipus determinat de dades. Els elements
s'emmagatzemen en el fitxer exactament igual que estan emmagatzemats en memòria principal,
és a dir, al llegir o escriure no es realitza cap tipus de conversió. Un fitxer binari és per tant de
semblant a un vector.

4.4.-Fitxers lògics i fitxers físics


En un llenguatge de programació, els fitxers són un tipus de dada més, i un fitxer concret es
referència utilitzant una variable de tipus fitxer. És el que denominem fitxer lògic.
En C++ hi ha dos tipus de dades bàsiques per a declarar fitxers:

ifstream // Per a declarar fitxers d’entrada (in)


ofstream // Per a declarar fitxers d’eixida (out)
Per a utilitzar estos tipus cal incloure el fitxer de capçalera <fstream.h>.

Exemple:
ofstream f;
Esta sentència ens declara una variable (fitxer lògic) de tipus fitxer d’eixida.

Tema 3: Fitxers 2/11


Informàtica FACULTAT DE MATEMATIQUES

[ ] Departament d’Informàtica Tema 3


UNIVERSITAT DE VALENCIA
Departamento de Informática
Curs 2022-2023

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");

A partir d’eixe moment ja podem usar el fitxer.

4.5.-Processament d’un fitxer


Sempre que volam realitzar qualsevol operació amb fitxers cal seguir el següent esquema:
Obertura de Fitxer → Operacions → Tancada del fitxer

4.4.1.-Obertura del fitxer:


L'obertura es realitza amb la instrucció open, com acabem de veure.
Per defecte, els fitxers d'entrada (ifstream) s'obrin només per a lectura posant la finestra del fitxer
en el primer element del fitxer. A més el fitxer ha d'existir, si no es genera un error.
Per defecte, els fitxers d'eixida (ofstream) s'obrin només per a escriptura creant el fitxer nou. Si el
fitxer ja existia és esborrat.
Per a modificar el mode d'obertura es pot afegir un paràmetre més a la instrucció open, que indica el
mode d'obertura. Només veurem el mode ios::app que servix per a obrir un fitxer d'eixida en mode
afegir, de manera que no borra el fitxer i la finestra del fitxer es posa després de l'últim element. Si
el fitxer no existix dóna error.
nom_fitxer_logic.open (nom_fitxer_fisic, ios::app);

Exemple:
f.open("dades.txt", ios::app);

Para saber si l’obertura del fitxer ha donat error s’usa l’operador ! aplicat al fitxer:

Tema 3: Fitxers 3/11


Informàtica FACULTAT DE MATEMATIQUES

[ ] Departament d’Informàtica Tema 3


UNIVERSITAT DE VALENCIA
Departamento de Informática
Curs 2022-2023

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";

4.5.3.-Tancament del fitxer:


Quan s'han acabat de realitzar totes les operacions, SEMPRE cal tancar el fitxer. Esta operació
destrueix les estructures que s'han creat per a obrir-ho (tant del programa com del sistema operatiu).
També actualitza totalment el fitxer, escrivint tota la informació que poguera quedar en el buffer
(normalment la informació passa a través d'un buffer).
Per a tancar el fitxer s'utilitza la instrucció close:

nom_fitxer_logic.close ();

Exemple:
f.close();

Tema 3: Fitxers 4/11


Informàtica FACULTAT DE MATEMATIQUES

[ ] Departament d’Informàtica Tema 3


UNIVERSITAT DE VALENCIA
Departamento de Informática
Curs 2022-2023

Exemple: Programa per a escriure els números del 1 al 10 al fitxer dades.txt

#include <fstream.h>

int main()
{
ofstream f;
int i;

// OBERTURA del fitxer


f.open("dades.txt");
if(!f)
cout << "Error obrint el fitxer" << endl;
else
{
// OPERACIONS sobre el fitxer
for(i = 1; i <= 10; i++)
f << i << endl;

// TANCAMENT del fitxer


f.close();
}
return 0;
}

Tema 3: Fitxers 5/11


Informàtica FACULTAT DE MATEMATIQUES

[ ] Departament d’Informàtica Tema 3


UNIVERSITAT DE VALENCIA
Departamento de Informática
Curs 2022-2023

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.

Tema 3: Fitxers 6/11


Informàtica FACULTAT DE MATEMATIQUES

[ ] Departament d’Informàtica Tema 3


UNIVERSITAT DE VALENCIA
Departamento de Informática
Curs 2022-2023

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.

4.5.4.-Lectura mitjançant get().

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.

Tema 3: Fitxers 7/11


Informàtica FACULTAT DE MATEMATIQUES

[ ] Departament d’Informàtica Tema 3


UNIVERSITAT DE VALENCIA
Departamento de Informática
Curs 2022-2023

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.

4.5.6.- Pas de paràmetres.


Finalment convé indicar que els fitxers s'han de passar sempre com a paràmetres per referència, no
importa si els modificarem o no. Modificarem el programa anterior incloent una funció
F_IntroTel que s'encarregarà de llegir la informació del fitxer i tornar-nos un boolean indicant
si hem arribat al final de fitxer o no.

Tema 3: Fitxers 8/11


Informàtica FACULTAT DE MATEMATIQUES

[ ] Departament d’Informàtica Tema 3


UNIVERSITAT DE VALENCIA
Departamento de Informática
Curs 2022-2023

Exemple: Programa per a llegir els números reals d’un fitxer i calcula la mitjana aritmètica.

#include <fstream.h>
#include <iostream.h>

float mitjanaAritmetica (ifstream& f);

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;
}

float mitjanaAritmetica (ifstream& f)


{
int n;
float dada, m, suma;

suma = 0.0;
n = 0;
while (f>>dada)
{
suma = suma + dada;
n++;
}
if (n>0)
m = suma / n;

return (m);
}

Tema 3: Fitxers 9/11


Informàtica FACULTAT DE MATEMATIQUES

[ ] Departament d’Informàtica Tema 3


UNIVERSITAT DE VALENCIA
Departamento de Informática
Curs 2022-2023

4.6. Fitxers binaris


Als els fitxers binaris, les dades es lligen o escriuen sense cap tipus de transformació. És un bolcat
directe de memòria a fitxer o de fitxer a memòria.

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.

Exemple: Lectura d’enters en binari.

#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;
}

Tema 3: Fitxers 10/11


Informàtica FACULTAT DE MATEMATIQUES

[ ] Departament d’Informàtica Tema 3


UNIVERSITAT DE VALENCIA
Departamento de Informática
Curs 2022-2023

Exemple: Escriptura de 10 enters en binari.

#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;
}

Tema 3: Fitxers 11/11

You might also like