Sunteți pe pagina 1din 30

Fiiere generalitati.

Colecie de date memorate pe un suport extern (floppy,


harddisk, etc) identificat printr-un nume.
Entiti ale sistemului de operare: numele lor respect
conveniile sistemului, fr legtur cu un limbaj de
programare
Numrul de elemente ale unui fiier este variabil (poate
fi nul). Se folosesc pentru
date iniiale sau rezultate mai numeroase
pstrarea permanent a unor date de interes pentru anumite
aplicaii

Operarea cu fisier
1. se definete o variabil de tip FILE * pentru accesarea
fiierului;
2. se deschide fiierul pentru un anumit mod de acces, folosind
funcia de biblioteca fopen, care realizeaz i asocierea ntre
variabila fiier i numele extern al fiierului
3. se prelucreaz fiierul - citire/scriere cu funciile specifice
4. se nchide fiierul folosind funcia de biblioteca fclose

Operaiile specifice prelucrrii fiierelor


sunt
crearea unui fiier
citirea de articole din fiier (consultarea
fiierului)
actualizarea (sau modificarea) fiierului
adugare de articole la sfritul fiierului
poziionarea n fiier.
tergerea unui fiier
schimbarea numelui unui fiier

Prelucrarea fiierelor se realizeaz pe dou


niveluri:
nivelul inferior (fizic), care apeleaz direct la sistemul
de operare.
nivelul superior(logic) care utilizeaz structuri
speciale FILE
Funciile de pe nivelul superior nu asigur o
independen total fa de sistemul de operare.
Funciile standard de intrare / ieire au prototipurile n
fiierul antet <stdio.h>.

FILE* si nume fisierului fizic


Asocierea dintre numele extern (un ir de
caractere) i variabila din program se face la
deschiderea unui fiier, printr-o funcie standard.
Fisierul logic este legat de un pointer FILE*.
Numele fisierului fizic apare in program o singura
data in momentul dechiderii fisierului si serveste
pentru comunicare cu cel fizic.

Accesul la fisiere.

Fiierele standard au pointerii predefinii:


stdin,stdout,stderr,stdprn,stdaux.
Declararea unui pointer la fiier are sintaxa :
FILE *pf;
Pentru deschiderea unui fiier se folosete
funcia
FILE * fopen(char *nume_fis,
char *mod_acces);

int fputs (const char *str, FILE *stream)


produce afiarea unui text n fluxul standard de ieire

#include < stdio.h >


int main (void)
{
// Linia write test se introduce in
fluxul //standard stdout
fputs (write test\n,stdout);
return 0;
}

Deschiderea unui fisier.


Deschiderea unui fiier
stabileste o conexiune logic ntre fiier i variabila pointer i
stabilete un mod de acces la fiier
aloc o zon de memorie pentru realizarea mai eficient a
operaiilor de intrare / ieire
Moduri de acces :
r - deschiderea unui fisier existent pentru citire
w - pentru scriere sau crearea unui fisier nou
a - deschiderea unui fisier existent pentru adaugare
r+ - deschiderea unui fisier existent pentru citire si scriere
w+- crearea unui fisier nou pentru scriere si citire
a+ - deschidere pentru adaugare si citire

Tipuri de fiiere n C
Fiiere text
conin o succesiune de linii, separate prin
NewLine
fiecare linie are 0 sau mai multe caractere

tipribile i/sau tab


Fiiere binare
conin o succesiune de octei
( In cazul fisierilor binare la litera unui modul de
acces se adauga litera b, rb,wb, ect.)

Fiiere text i fiiere binare


ntr-un fiier text, toate datele sunt memorate ca iruri de
caractere, organizate pe linii, separate ntre ele prin
marcajul sfrit de linie \n.
ntr-un fiier binar, datele sunt pstrate n formatul lor
intern (2 octei pentru int, 4 octei pentru float, etc).
La fiierele text marcajul de sfrit de fiier (caracterul
0X1A) exist fizic n fiier. La ntlnirea acestui caracter
funcia fgetc() ntoarce EOF (-1). Marcajul de sfrit de
fiier se genereaz de la tastatur prin Ctrl-Z.
La fiierele binare, marcajul de sfrit de fiier nu exist
fizic n fiier, ci este generat de funcia fgetc().

Fisiere text
Caracter terminator de linie:
fiierele Unix/Linux:
un singur caracter terminator de linie \n
fiierele Windows i MS-DOS:
caracterele \r i \n (CR, LF) ca terminator de linie
Un fiier text poate fi terminat printr-un caracter
terminator de fiier (Ctrl-Z = EOF = -1)
Sfritul unui fiier disc poate fi detectat i pe baza
lungimii fiierului (numr de octei), memorat pe disc.
Se realizeaz conversia automat din/n format extern
(ir de caractere) n/din format intern (binar virgul fix
sau virgul mobil)

Exemple
deschidem fis. inp.txt pentru citire
FILE *f; // declaram un pointer la fisier
f= fopen(inp.txt , r);
Pentru excluderea posibilei greseli putem utiliza:

if ( f = fopen(inp.txt , r ) != NULL )
{ //prelucrarea fisierului }

Exemplu1. Citire si afisare linii din fisier

void main()
{ FILE *fp;
char s[80];
if ( (fp=fopen("c:\\test.c , "r")) == NULL )
{ printf ( "Nu se poate deschide fiierul!\n );
exit (1);}
while ( fgets(s, 80, fp) != NULL )
printf ( "%s", s);
fclose (fp);
}

Inchiderea unui fiier


int fclose(FILE *pf);
ntoarce 0 la nchidere normal i EOF la producerea unui
incident
fiierele standard nu se nchid de ctre programator
pentru un fiier de ieire, se scriu datele rmase nescrise
din buffer n fiier, aa c operaia de nchidere este
obligatorie
n cazul unui fiier de intrare, datele necitite din bufferul de
intrare sunt abandonate
se elibereaz bufferele alocate
se ntrerupe conexiunea pointer fiier

Operatii de intrare / iesire.


Tip
fisier

Conversie

Unitate
transferata
caracter

fgetc()
fputc()

linie

fgets()
fputs()

cu

linii

fscanf()
fprintf()

fara

articol

fread()
fwrite()

fara
text

binar

Functii
folosite

Operaii de I/ O pentru iruri de caractere

char *fgets( char *s, int n, FILE *pf );


citete caractere din fiierul cu pointerul pf, pn la
ntlnirea primului caracter \n (cel mult n-1 caractere)
n tabloul s; pune la sfrit \n i \0
ntoarce s sau NULL la ntlnire sfrit de fiier sau la
eroare
int fputs( char *s, FILE *pf );
copiaz irul n fiierul de ieire
nu copiaz terminatorul de ir \0
ntoarce un rezultat nenegativ (numrul de caractere
scrise n fiier), sau EOF la producerea unei erori

Exemplul 2: Copierea unui fisier.


#define MAX 100
void copiere2(FILE *d, FILE *s)
{
char linie[MAX];
while(fgets(linie, MAX, s))
fputs(linie, d);
}

Operaii de intrare / ieire cu format


int fprintf(FILE *pf,
char *format,lista_expr);

transfer n fiierul specificat, valorile expresiilor, convertite,


potrivit formatului n caractere
ntoarce numrul de caractere scrise, sau o valoare negativ,
dac s-a produs o eroare.

int fscanf(FILE *pf, char *format,


lista_adrese_var);

se citesc date din fiierul pf, sub controlul formatului,


iniializndu-se variabilele din list
funcia ntoarce numrul de cmpuri citite sau EOF n caz de
producere a unui incident la citire sau ntlnire a marcajului de
sfrit de fiier.

Ex. 3. Se citeste o valoare de tip int din fisierul


l1.txt si se scrie in fisierul out_f.txt
...

void main()
{ FILE *f;
int dig;
if (( f = fopen( "l1.txt , "r )) == NULL)
{ printf("\n"); exit(0); }
fscanf( f, "%d", &dig); fclose(f);
f=fopen( "out_f.txt", "w");
fprintf (f," %d",dig);
fclose(f); }

Exemplu 5. Un program pentru scriere unui numar


de valori de tip int in fisier binar
void main()
{FILE *f_out;
int number;
randomize();
f_out = fopen("int.dat","wb" );
if ( ! f_out )
{puts("Is it impossible to create file !");
exit(1);
}
for(int i=0; i<100; i++)
{ number[i]=random(100)-50;
fwrite (&number , sizeof(int) , 1 , f_out );
}
fclose(f_out);
}

Intrri / ieiri n modul de acces binar


sunt operaii de transfer (citiri / scrieri) fr conversii
se fac la nivel de articol
poziia n fiier este actualizat dup fiecare citire / scriere
unsigned fread(void *zona,
unsigned la,
unsigned na,
FILE *pf);
citete cel mult na articole, de lungime la fiecare, din
fiierul pf n zona
ntoarce numrul de nregistrri citite sau 0 n caz de
eroare sau sfrit de fiier

Intrri / ieiri n modul de acces binar


unsigned fwrite(void *zona,
unsigned la,
unsigned na,
FILE *pf);
scrie na articole de lungime la, din zona n fiierul pf
ntoarce numrul de articole scrise.
Pentru a copia un fiier binar (sau text) folosind
funciile fread() i fwrite() vom considera
lungimea articolului 1 octet.

Exemplul 4: Copierea unui fisier in mod binar.

void copiere(FILE * d, FILE * s)


{
int noc;
// numar de octeti cititi
char zona[MAX];
while((noc = fread(zona,1,MAX,s))>0)
fwrite(zona, 1, noc, d);
}

Functii pentru acces direct


int fseek (FILE *fp, long int offset, int poziie)
poziioneaz indicatorul de poziie la valoarea dat de offset
fa de poziie:
SEEK_SET = 0 - Cutarea se face de la nceputul fis.
SEEK_CUR = 1 - Cutare din poziia curent
SEEK_END = 2 - Cutare de la sfritul fiierului
Intr-un fiier text poziionarea este posibil numai fat de
nceputul fiierului, iar poziia se obine printr-un apel al
funciei ftell

Poziionarea n fiier
long ftell(FILE *pf);
ntoarce poziia curent n fiier, exprimat prin
numrul de octei fa de nceputul fiierului

void rewind(FILE *pf);


realizeaz o poziionare la nceputul fiierului, fiind
echivalent cu:

fseek(pf, 0L, SEEK_SET);

Exemplul 4: Dimensiunea unui fisier.


long FileSize(FILE *pf)
{ long pozv, noct;
pozv = ftell(pf);//salvare poz curenta
//pozitionare la sfarsit
fseek(pf, 0L, SEEK_END);
noct = ftell(pf); // nr de octeti
//revenirea la pozitia veche
fseek(pf, pozv, SEEK_SET);
return noct;
}

Descriptor al fisierului
int fileno (const FILE *stream) ;
"fileno" intoarce numarul- descriptor fisierului.
Pentru "stdin", "stdout", and "stderr" fileno
intoarce 0, 1, and 2 respectiv. Pentru cele
lalte 3-19.
In caz de eroare "fileno" returneaza -1

Tratarea erorilor
int feof(FILE *pf);
ntoarce o valoare diferit de 0, dac s-a
detectat marcajul de sfrit de fiier
int ferror(FILE *pf);
ntoarce o valoare diferit de 0, dac s-a
detectat o eroare n cursul operaiei de intrare /
ieire

Exemplu.6. Se cauta vaoarea maxima float din fisier


si se inlocueste cu valoarea=0

void main()
{ FILE *f_inp;
int n_max; int handle;
float val, max, zero=0;
f_inp = fopen ( "float.dat ", "rb" );
if ( !f_inp )
{ puts(" It is impossible to read file !");
exit(1);
}
handle = fileno (f_inp);
//handle obtine valoarea intoarsa de functia fileno()

Exemplu 6. continuare
n_max=0;
fread(&max, sizeof(float) , 1 , f_inp);
for(int i=1; I < filelength (handle); i++)
{ fread(&val, sizeof(float) , 1 , f_inp);
if (val > max)
{ max=val; n_max=i; }
}
fseek( f_inp, n_max * sizeof(float), SEEK_SET);
fwrite(&zero, sizeof(float), 1, f_inp);
fclose(f_inp);
}

S-ar putea să vă placă și