Professional Documents
Culture Documents
UF3 Gestio de Fitxers
UF3 Gestio de Fitxers
Gesti de fitxers
1 de 19
ndex de continguts
Memria externa i memria interna ....................................................................................................3 Fitxers intern i extern ...........................................................................................................................3 Operacions amb fitxers ........................................................................................................................4 Operacions amb fitxers en C ...............................................................................................................4 Obrir un fitxer (fopen).....................................................................................................................5 Tancar un fitxer (fclose)...................................................................................................................5 Exemple 1: Mostrar un fitxer de text per pantalla............................................................................6 Comprovar si hem arribat al final del fitxer (feof)...........................................................................6 Lectura de fitxers de text especificant el format (fscanf).................................................................7 Exemple 1 (segona part de la resposta)............................................................................................7 Escriptura de fitxers de text especificant el format (fprintf)............................................................7 Exercici 1: copiar un fitxer obert sobre un altre (tamb obert)........................................................8 Llegir lnia a lnia (fgets).................................................................................................................8 Exercici 2: comptar el nmero de lnies d'un fitxer.........................................................................8 Escriure lnia a lnia (fputs).............................................................................................................9 Exercici 3: copiar un fitxer lnia a lnia............................................................................................9 Exercici 4: simular el comportament bsic de la comanda cat.....................................................9 Exercici 5: simular el comportament bsic de la comanda wc.....................................................9 Exercici 6: simular el comportament bsic de la comanda cmp.................................................10 E/S de blocs (fitxers binaris)..........................................................................................................10 Mirar on est el cursor del fitxer (ftell)..........................................................................................10 Moure el cursor (o indicador de posici) d'un fitxer......................................................................11 Exemple 2: Calcular la longitud d'un fitxer...................................................................................11 Exemple 2 (segona part de la resposta)..........................................................................................12 Escriptura de registres en un fitxer binari......................................................................................13 Exemple 3: Crear i omplir amb sencers un fitxer binari................................................................13 Exemple 3 (segona part de la resposta)..........................................................................................14 Lectura de registres en un fitxer binari..........................................................................................15 Exemple 4: mostrar els sencers d'un fitxer binari..........................................................................15 Exemple 4 (segona part de la resposta)..........................................................................................16 Exercici 7: Trobar el valor mnim d'un fitxer binari de sencers.....................................................16 Exercici 8: Mostrar en ordre invers els sencers d'un fitxer binari..................................................16
Fonaments de Programaci
Gesti de fitxers
2 de 19
Exercici 9: Sumar els sencers de dos fitxers binaris en un tercer..................................................17 Exercici 10: Modificar els valors senars d'un fitxer binari de sencers...........................................17 Exercici 11: Crear un fitxer binari amb dades de persones............................................................17 Exercici 12: Mostrar les dades presents en un fitxer binari de persones........................................18 Exercici 13: Mostrar per nom les dades d'un fitxer binari de persones..........................................18 Exercici 13: Mostrar per pes les dades d'un fitxer binari de persones...........................................19 Exercici 14: Obtenir les dades d'una persona (sabent el DNI).......................................................19 Exercici 15: Modificar el nom d'una persona (sabent el DNI).......................................................19 Exercici 16: Comprovar quantes vegades apareix un DNI.............................................................19
Fonaments de Programaci
Gesti de fitxers
3 de 19
Hem definit una variable fciutat de tipus fitxer. El nostre programa ha d'accedir al fitxer extern per exemple ciutat.dat i que dins del programa t el nom fciutat.
Fonaments de Programaci
Gesti de fitxers
4 de 19
s amb aquesta funci que s'estableix el lligam entre el fitxer extern i l'intern (f). A ms, normalment, aquesta funci t ms arguments que ens indicaran com s'obre el fitxer, per exemple: crear-lo si no existeix per a lectura per a escriptura
Quan acabem de fer servir el fitxer, haurem de desfer el lligam entre el fitxer extern i l'intern, aix es fa amb la funci tancarFitxer. Aquesta funci noms admet un parmetre que s la variable de tipus fitxer:
error:=tancarFitxer"f';
Aquest nou tipus de dades s un stream i s el que es fa servir per treballar amb els fitxers de forma cmoda en C. Tamb es pot treballar amb fitxers amb els descriptors per ara ens centrarem en les operacions per a aquest tipus stream. stream s l'objecte que el llenguatge C incorpora perqu es pugui utilitzar qualsevol dispositiu.
Fonaments de Programaci
Gesti de fitxers
5 de 19
Les funcions per tractar fitxers que presenta C en la llibreria stdio.h sn (entre altres): Operaci: Obrir F. de text F. binaris fopen fopen Comprovar feof ftell fseek Moure Llegir fgets / fscanf fread Escriure fputs / fprintf fwrite Tancar fclose fclose
El que retorna s l'stream que farem servir a la resta del programa per treballar amb el fitxer. En cas d'error retorna NULL (0). nom_extern s una cadena que ens dna el nom que t al suport fsic el fitxer amb qu volem treballar. mode es refereix al tipus d'obertura del fitxer (vegeu taula de modes ms abaix).
Mode (*) r w
Funcionalitat: Accs per a lectura; si el fitxer no hi s o no es troba, retorna un error. Accs per a escriptura; si el fitxer no existeix es crea i si existeix es destrueix el seu contingut i s creat de nou sense guardar-ne cap cpia. Mentre s obert, es permet escriure al final (afegint-ne) o damunt la informaci existent. Accs per afegir informaci al final; si el fitxer no existeix el crea. Accs per a llegir i escriure amb la funcionalitat del mode r Accs per a llegir i escriure amb la funcionalitat del mode w
a r+ w+
(*) Hi han molts ms modes, per amb aquests podrem fer tots (o quasi tots) els exercicis segents.
Allibera els recursos al sistema i acaba de desar la informaci. Si funciona b retorna zero, en cas d'error retorna EOF.
Fonaments de Programaci
Gesti de fitxers
6 de 19
Observeu que la funci mostrarFitxerObert (definida abans de la lnia 17) es pot aprofitar (com es fa a la lnia 37) per mostrar el fitxer stdin que sempre est obert.
Retorna un valor diferent de zero quan s'ha arribat al final del fitxer i zero en cas contrari.
Fonaments de Programaci
Gesti de fitxers
7 de 19
Omple els valors dels arguments seguint el format especificat, llegint-los del fitxer f.
Fonaments de Programaci
Gesti de fitxers
8 de 19
Retorna la cadena linia llegida de l'stream f, tallant quan s'arriba al primer '\n'. La variable linia inclou el carcter '\n'. En cas de lnies de longitud >=n, noms llegeix els (n-1) primers carcters.
Fonaments de Programaci
Gesti de fitxers
9 de 19
Envia (escriu) la cadena linia a l'stream f. El carcter '\0' de final de cadena no s'envia a l'stream.
Fonaments de Programaci
Gesti de fitxers
10 de 19
Fonaments de Programaci
Gesti de fitxers
11 de 19
Retorna FALSE si no s'ha pogut moure el cursor. La nova posici, calculada en bytes des del comenament del fitxer f, s la suma de distancia i la posici especificada per origen. Origen pot ser SEEK_SET (comptem des del comenament del fitxer), SEEK_CUR (comptem des de la posici actual) o SEEK_END (comptem des del final de fitxer). La figura segent illustra l'efecte de diferents combinacions de valors positius o negatius del segon parmetre (distancia) i del tercer (origen) sobre un fitxer binari que cont 13 registres (numerats del 0 al 12) de tipus char i suposant que la situaci actual del cursor s la corresponent a la posici 6 on hi ha la lletra c.
Cal tenir en compte que el segon parmetre (distancia) no pot ser negatiu en el cas d'utilitzar el valor SEEK_SET com a tercer parmetre. En canvi si podem usar valors positius per a la distncia quan l'origen s SEEK_END: en aquest cas, l'efecte s l'ampliaci de la mida del fitxer.
Fonaments de Programaci
Gesti de fitxers
12 de 19
Observeu que la funci longitudFitxer obre el fitxer amb el modus r+, s a dir, lectura amb accs aleatori.
Fixeu-vos que s'utilitza el valor 0L (zero de tipus long) com a segon parmetre i la constant simblica SEEK_END per indicar que volem situar el cursor al final del fitxer: s adir, just a continuaci del darrer registre o, si s'entn millor, en la primera posici lliure.
Fonaments de Programaci
Gesti de fitxers
13 de 19
Retorna el nmero de carcters escrits correctament, que pot ser menor que nR*midaR, per noms si es detecta un error de escriptura. Escriu al fitxer f les dades que comencen en *dades, fins a nR elements cada un d'ells de mida midaR bytes.
Fonaments de Programaci
Gesti de fitxers
14 de 19
Fonaments de Programaci
Gesti de fitxers
15 de 19
Retorna el nmero de carcters llegits correctament, que pot ser menor que nR*midaR, per noms si es detecta un error de lectura. Llegeix del fitxer f guardant les dades en la variable indicada per *dades, fins a nR elements cada un d'ells de mida midaR bytes.
Fonaments de Programaci
Gesti de fitxers
16 de 19
Noteu que, per saber el nmero de registres que hi ha al fitxer, s'usa la funci longitudFitxerObert desenvolupada per a un exemple anterior.
Fonaments de Programaci
Gesti de fitxers
17 de 19
Exercici 10: Modificar els valors senars d'un fitxer binari de sencers
Desenvolupeu una funci canviarSenarsFitxer que recorri un fitxer binari de sencers (el nom del qual es proporciona com a parmetre de la funci) i, incrementi en un el valor de tots aquells sencers presents en el fitxer que siguin senars. Per exemple, si el fitxer inicialment cont els valors (10, 21, 13, 24) acabar tenint els valors (10, 22, 14, 14). Important: cal desenvolupar una funci canviarSenarsFitxerObert seguint la mateixa pauta dels exemples i exercicis anteriors de separar la gesti de l'obertura/tancament dels fitxers per un costat i les operacions sobre fitxers oberts per un altre. Pista: Cada posici del fitxer binari primer s'ha de llegir i desprs, si escau, s'ha de tornar a escriure amb el valor modificat.
Punters inicials per a cada cadena>>> Josep Teresa Manel 04-04-1962 27-01-1958 25-04-1967 170 160 168 70 55 78
El nom del fitxer binari es proporciona com a argument del programa. El fitxer de text es pot assimilar a l'entrada estndard (no cal obrir ms fitxers). La primera lnia/registre s especial ja que noms cont tres nmeros sencers (de tipus long int). Es proporciona un exemple: persones2.txt
Fonaments de Programaci
Gesti de fitxers
18 de 19
Exercici 13: Mostrar per nom les dades d'un fitxer binari de persones
Desenvolupeu una funci mostrarPersonesPerNomFitxer que mostri per ordre del camp Nom totes les dades presents en un fitxer binari de persones com el de l'exercici anterior. El nom del fitxer s el parmetre de la funci. Pista: Mireu el contingut del camp Cadena nom tant en el primer registre com en els segents. Pista 2: Com a complement es proporciona la segent figura amb ms registres dels mostrats anteriorment (i sense indicar els valors dels camps Cadena pes ni Cadena altura). Es recomana intentar completar (amb paper i llapis) els valors d'aquests dos camps per entendre el mecanisme.
Cadena Cadena altura pes
Fonaments de Programaci
Gesti de fitxers
19 de 19
Exercici 13: Mostrar per pes les dades d'un fitxer binari de persones
Desenvolupeu una funci mostrarPersonesPerPesFitxer que mostri per ordre del camp Pes totes les dades presents en un fitxer binari de persones com el de l'exercici anterior. El nom del fitxer s el parmetre de la funci. Pista: una vegada determinats (amb paper i llapis) els valors dels camps Cadena pes iCadena altura podeu modificar el fitxer persones2.txt (canviant els valors 00 pels que corresponguin) i crear un fitxer binari (usant el programa desenvolupat per a l'exercici 11). Aquest fitxer binari s el que podeu usar per a fer les proves d'aquesta nova funci. Important: recordeu que cal desenvolupar una funci mostrarPersonesPerPesFitxerObert seguint la mateixa pauta dels exemples i exercicis anteriors de separar la gesti de l'obertura/tancament dels fitxers per un costat i les operacions sobre fitxers oberts per un altre.