INTERFÍCIE D'ENTRADA/SORTIDA

La biblioteca estàndard de C defineix l'estructura (struct) FILE a la capçalera stdio.h o en alguna de les que allà s'hi incloguin.

No ens interessa conèixer l'estructura a fons, ens conformem a saber que els fitxers es tracten com a FILE * (apuntadors a FILE o streams)

OBERTURA DE FITXERS

El primer exemple el trobem al perfil de les funcions que serviran per a obrir fitxers:

#include <stdio.h>

FILE * fopen (const char * nomfitxer, const char * mode);

FILE * freopen (const char * nomfitxer, const char * mode, FILE * apfitx);

fopen: Obre el fitxer nomfitxer i retorna una stream. Si per algun motiu no es pot obrir el fitxer, retornarà un apuntador NULL i la variable errno contindrà el tipus d'error que s'hagi produït.

Pel que fa al mode, aquest pot ser: "r", "w", "a", "r+", "w+" o "a+", lletres que fan referència als verbs en anglès read, write i append.

L'efecte dels diferents modes d'obertura queda representat a la següent taula:

 
Permet llegir?
Permet escriure?
Si el fitxer ja existeix
Si el fitxer no existeix
"r"
No
Es posiciona al començament
Dóna error
"w"
No
El sobrescriu
Es crea
"a"
No
Es posiciona al final
Es crea
"r+"
Es posiciona al començament
Dóna error
"w+"
El sobrescriu
Es crea
"a+"
Es posiciona al final
Es crea

 

Quan s'executa una funció main de C, disposem de 3 apuntadors a FILE:

stdin Entrada estàndard (normalment el teclat)
stdout Sortida estàndard (el monitor)
stderr Sortida d'error estàndard (també pel monitor)

Si, tal com fem a la línia de comandes, volguéssim canalitzar algun d'aquests apuntadors a un fitxer, podríem fer ús de la funció que expliquem tot seguit.

freopen: Mira de tancar el fitxer associat a apfitx (hem triat aquest nom per apuntador a FILE, fitxer) i si pot obrir nomfitxer, li associa aquest mateix stream: apfitx. En cas contrari retornarà NULL i errno contindrà el codi d'error.

ERRORS

Abans de continuar, parlem dels errors que codifica la variable errno.

Entre les estructures de biblioteca de C, es troba el vector char * sys_errlist[], que com es pot veure és un vector d'strings, de frases, que descriuen els errors que codifica errno.

El nombre d'elements del vector, ve donat per la variable sys_nerr, que tal com errno és un enter.

El següent programa mostraria els diversos missatges d'aquesta llista d'errors:

#include <stdio.h>

extern int sys_nerr;

main()
{
int i;

for (i=0;i<sys_nerr;i++)
            printf("L'error %d és %s\n",i,sys_errlist[i]);
}

Tot i això, no és recomanable d'utilitzar aquestes estructures directament sinó mitjançant l'acció següent:

#include <stdio.h>

void perror (char * frase);

Si la invoquem, per exemple així: perror ("Un cert punt del programa")i suposant que errno està codificant l'error corresponent a que no es troba un determinat fitxer o directori:

Un cert punt del programa: No such file or directory

El següent programa, que anomenaràs obrirfit.c, et permetrà practicar amb el que s'ha explicat fins ara. Abans de provar-lo, crea el fitxer /tmp/proves.txt

Practica ara provocant errors: canvia el fitxer per un que no existeixi, intenta obrir fitxers sobre els quals no tinguis permís d'accés...

Prova també diversos modes d'accés.

Intenta també redirigir el canal d'error estàndard a un fitxer i comprova que has tingut èxit.

 

 

Autor: Lluís València López

Creative Commons License
Aquesta obra està subjecta a una Llicència de Creative Commons.