Sunteți pe pagina 1din 61

Universitatea Constatin Brncui Trgu-Jiu

Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu

Programarea
calculatoarelor
Lect.dr. Adrian Runceanu

Curs 13

06.12.2011

Programarea calculatoarelor

Capitolul 11. Fiiere

11.1. Declarare. Operaii cu fiiere


11.2. Prelucrarea fiierelor la nivel inferior
11.3. Prelucrarea fiierelor la nivel superior
11.4. Probleme rezolvate

06.12.2011

Programarea calculatoarelor

11.1. Declarare. Operaii cu fiiere.

Fiierul este o colecie de informaii


ordonat n nregistrri.

06.12.2011

Programarea calculatoarelor

11.1. Declarare. Operaii cu fiiere.


Fiierele pot fi de mai multe tipuri, n funcie
de datele ce se memoreaz n ele:
1. fiier text conine doar caractere ASCII, iar
nregistrrile sunt separate prin caracterele
speciale CR i LF
2. fiier standard ( fiierul header ) este un fiier
text
3. fiierul binar este un fiier ce conine date n
format intern, iar nregistrrile nu se mai
separ prin caractere speciale
06.12.2011

Programarea calculatoarelor

11.1. Declarare. Operaii cu fiiere.


1. Operaii cu fiiere
Prezentm n continuare operaiile ce se
pot efectua cu fiiere n limbajul C:
deschiderea unui fiier
crearea unui fiier
actualizarea unui fiier
consultarea unui fiier
06.12.2011

Programarea calculatoarelor

11.1. Declarare. Operaii cu fiiere.


poziionarea pe o anumit nregistrare din
fiier
tergerea unui fiier
tergerea de nregistrri din fiier
redenumirea unui fiier

06.12.2011

Programarea calculatoarelor

11.1. Declarare. Operaii cu fiiere.


Se cunosc dou nivele de prelucrare a
fiierelor i anume:
1. Nivelul inferior de prelucrare se face apel
la funciile sistemului de operare MS-DOS
(ncorporat n SO Windows).
2. Nivelul superior de prelucrare se folosesc
funcii specializate n lucrul cu fiierele.

06.12.2011

Programarea calculatoarelor

11.1. Declarare. Operaii cu fiiere.


Observaie:

n limbajul C++, nu exist instruciuni de


intrare/ieire ci numai funcii specializate
pentru aceste operaii. (funcii care
prelucreaz stream-uri)

06.12.2011

Programarea calculatoarelor

Capitolul 11. Fiiere

11.1. Declarare. Operaii cu fiiere


11.2. Prelucrarea fiierelor la nivel inferior
11.3. Prelucrarea fiierelor la nivel superior
11.4. Probleme rezolvate

06.12.2011

Programarea calculatoarelor

10

11.2. Prelucrarea fiierelor la nivel inferior


Pentru a putea utiliza prelucrarea
fiierelor la nivel inferior, trebuie s includem
n program urmtoarele fiiere standard:

<io.h>
<fcntl.h>

06.12.2011

Programarea calculatoarelor

11

11.2. Prelucrarea fiierelor la nivel inferior


a) Deschiderea unui fiier se
efectueaz pentru ca s se asocieze
fiierului de pe suportul fizic, un numr
ntreg numit descriptor de fiier = [df].

06.12.2011

Programarea calculatoarelor

12

11.2. Prelucrarea fiierelor la nivel


inferior
Descriptorii pentru fiierele standard sunt:
DENUMIRE
FISIER
stdin
stdout
stderr
s

06.12.2011

SEMNIFICATIE
tastatura
monitor
fiier de erori

VALOARE
DESCRIPTOR
0
1
3

Programarea calculatoarelor

13

11.2. Prelucrarea fiierelor la nivel inferior


Funcia utilizat este open i are urmtoarea
sintax:
int open(const char *cale, int acces);

Unde:
cale este un pointer ctre o zon de tip
caracter, zon n care este specificat calea de
acces ctre fiierul ce trebuie deschis;
Dac descrierea complet a cii de acces
lipsete, atunci fiierul va fi cutat n directorul
curent.
06.12.2011

Programarea calculatoarelor

14

11.2. Prelucrarea fiierelor la nivel inferior


acces - este o constant predefinit care poate
avea urmtoarele valori:
valoare

O_RDONLY
O_WRONLY
O_RDWR
O_APPEND
O_TEXT
O_BINARY

semnificatie

deschis doar pentru citire


deschis doar pentru scriere
deschis pentru citire i scriere
deschis pentru adugare la sfrit
deschidere fiier text
deschiderea fiier binar

Se pot face i combinaii ntre aceste valori:


O_RDONLY | O_WRONLY, sau O_RDONLY |
O_BINARY.

06.12.2011

Programarea calculatoarelor

15

11.2. Prelucrarea fiierelor la nivel inferior


Exemplu:
Urmtoarea secven de program se poate folosi pentru a
testa existena unui fiier cu numele EXEMPLU.DAT:

int df;
if( (df=open(C:\EXEMPLU.DAT, O_RDONLY)) == -1 )
{
cout<<Eroare la deschiderea fisierului<<endl;
exit(1);
}
Valoarea ce o returneaz funcia open() poate fi:
> 0, dac fiierul a fost gsit
-1, dac fiierul nu a fost gsit
06.12.2011

Programarea calculatoarelor

16

11.2. Prelucrarea fiierelor la nivel inferior


b) Crearea unui fiier se efectueaz cu ajutorul funciei
creat, care are urmtoarea sintax:
int creat(const char *cale, int mod);
Unde:
cale este un pointer ctre o zon de tip caracter, zon n
care este specificat calea de acces ctre fiierul ce
trebuie deschis
Dac descrierea complet a cii de acces lipsete,
atunci fiierul va fi cutat n directorul curent.
06.12.2011

Programarea calculatoarelor

17

11.2. Prelucrarea fiierelor la nivel inferior


mod este modul de acces la fiierul respectiv:
valoare
S_IREAD
S_IWRITE
S_EXEC

semnificatie
creat pentru citire
creat pentru scriere
fiier executabi

valorile returnate de funcia creat sunt:


> 0 dac fiierul poate fi creat
-1, n caz contrar
06.12.2011

Programarea calculatoarelor

18

11.2. Prelucrarea fiierelor la nivel inferior


Exemplu:
Urmtoarea secven de program se poate folosi pentru
testa existena unui fiier cu numele FISIER.DAT:

int df;
if( (df=creat(C:\FISIER.DAT, S_WRITE)) == -1 )
{
cout<<Eroare la deschiderea (crearea)
fisierului\n;
exit(1);
}
06.12.2011

Programarea calculatoarelor

19

11.2. Prelucrarea fiierelor la nivel inferior


c) Citirea datelor dintr-un fiier se efectueaz cu
ajutorul funciei read, care are urmtoarea
sintax:
int read(int df, void *buf, int lung);

Se citete secvenial din fiierul desemnat


de descriptorul de fiier df un numr de octei lung care se depun la adresa desemnat de buf
06.12.2011

Programarea calculatoarelor

20

Capitolul 11. Fiiere

11.1. Declarare. Operaii cu fiiere


11.2. Prelucrarea fiierelor la nivel inferior
11.3. Prelucrarea fiierelor la nivel superior
11.4. Probleme rezolvate

06.12.2011

Programarea calculatoarelor

21

11.3. Prelucrarea fiierelor la nivel superior


Pentru a putea utiliza prelucrarea fiierelor
la nivel superior, trebuie s includem n program
urmtorul fiier standard: <stdio.h>.
a) Declararea unei variabile de tip fisier se
efectueaza astfel:
FILE *pointer_fisier;

06.12.2011

Programarea calculatoarelor

22

11.3. Prelucrarea fiierelor la nivel superior


b) Deschiderea unui fiier se efectueaz cu ajutorul functiei
fopen:
FILE *fopen(const char *nume, const char *mod);

Unde:
nume este adresa unui sir de caractere care defineste
numele fisierului care se deschide
mod este adresa unui sir de caractere care defineste modul
de prelucrare a fisierului dupa deschidere
Acest sir poate fi:
"r" deschidere pentru citire
"w"- deschidere pentru scriere
"a"- deschidere pentru scriere la sfarsitul fisierului
06.12.2011

Programarea calculatoarelor

23

11.3. Prelucrarea fiierelor la nivel superior


Exemplu: Urmtoarea secven de program se poate
folosi pentru testa existena unui fiier cu numele
EXEMPLU.DAT:
FILE *f;
if( ( f = fopen(C:\EXEMPLU.DAT, "r") ) == -1 )
{
cout<<\nEroare la deschiderea fisierului<<endl;
exit(1);
}
Valoarea ce o returneaz funcia fopen poate fi:
adresa variabilei de tip fisier, dac fiierul a fost gsit,
sau -1, dac fiierul nu a fost gsit.
06.12.2011

Programarea calculatoarelor

24

11.3. Prelucrarea fiierelor la nivel superior


Transferul unui caracter in sau dintr-un fisier text
se efectueaz cu ajutorul funciilor putc() si getc(), care
au urmtoarele sintaxe:
int putc(int c, FILE *f);
int getc(FILE *f);

Functia putc() scrie caracterul cu codul ASCII c in


fisierul asociat lui f si returneaza valoarea lui c sau
valoarea -1 in caz de eroare.
Functia getc() returneaza codul ASCII al caracterului
citit din fisierul asociat lui f.
06.12.2011

Programarea calculatoarelor

25

11.3. Prelucrarea fiierelor la nivel superior


Transferul unui ir de caractere n sau dintrun fiier text se realizeaz folosind funciile
fgets() i fputs() care au urmtoarele sintaxe:
char fgets(char *s, int n, FILE *f);
int fputs(const char *s, FILE *f);

06.12.2011

Programarea calculatoarelor

26

11.3. Prelucrarea fiierelor la nivel superior


Citiri/scrieri cu format se realizeaz cu
funciile fscanf() i fprintf() care permit citirea
respectiv scrierea n fiier i care au
urmtoarele sintaxe:
int fscanf(FILE *f, const *format, . . .);
int fprintf(FILE *f, const *format, . . .);

06.12.2011

Programarea calculatoarelor

27

11.3. Prelucrarea fiierelor la nivel superior


nchiderea unui fiier se realizeaz cu ajutorul
funciei fclose() care are urmtoarea sintax:
int fclose(FILE *f);

06.12.2011

Programarea calculatoarelor

28

Capitolul 11. Fiiere

11.1. Declarare. Operaii cu fiiere.


11.2. Prelucrarea fiierelor la nivel inferior
11.3. Prelucrarea fiierelor la nivel superior
11.4. Probleme rezolvate

06.12.2011

Programarea calculatoarelor

29

11.4. Probleme rezolvate


Problema 1:
Un program care citete un ir de numere
de la tastatur i apoi scrie n fiierul
"FISIER3.DAT", pe o linie, cte dou numere
consecutive, insernd ntre ele suma lor.

06.12.2011

Programarea calculatoarelor

30

11.4. Probleme rezolvate


#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<iostream.h>
FILE *pf;
int i, n, x[30], nr;
double a;

06.12.2011

Programarea calculatoarelor

31

11.4. Probleme rezolvate


int main()
{
cout<<"\ndati nr. de elemente : ";
cin>>nr;
for(i = 1; i <= nr; i++)
{
cout<<"x["<<i<<"] = ";
cin>>x[i];
}

06.12.2011

Programarea calculatoarelor

32

11.4. Probleme rezolvate


pf = fopen("fisier3.dat","w");
for(n=1 ; n<=nr; n++)
{
a = x[n] + x[n+1];
fprintf(pf, "%d %4.2f %d\n", x[n], a, x[n+1]);
}
fclose(pf);
}

06.12.2011

Programarea calculatoarelor

33

06.12.2011

Programarea calculatoarelor

34

11.4. Probleme rezolvate


Problema 2:
Se citete un ir de numere ntregi din fiierul
NUMERE.TXT.
Fiierul conine:
pe primul rnd numrul n de elemente ale irului
apoi pe al doilea rnd elementele irului separate
prin spaii.

S se afieze elementele pare din ir.


06.12.2011

Programarea calculatoarelor

35

11.4. Probleme rezolvate


Exemplu:
NUMERE.TXT
5
6 7 -2 4 11
Se vor afia valorile:

06.12.2011

-2

Programarea calculatoarelor

36

11.4. Probleme rezolvate


#include<stdio.h>
#include<iostream.h>
FILE *f;
int i, n, x;
int main()
{
f = fopen(NUMERE.TXT,r);
fscanf(f, %d, &n);
06.12.2011

Programarea calculatoarelor

37

11.4. Probleme rezolvate


for(i=1; i<=n; i++)
{
fscanf(f, %d, &x);
if(x % 2 == 0)
cout<<x<< ;
}
fclose(f);
}
06.12.2011

Programarea calculatoarelor

38

06.12.2011

Programarea calculatoarelor

39

11.4. Probleme rezolvate


Problema 3:
n fiierul SIR.TXT exist pe fiecare linie
cte un numr din irul primelor n (n<300)
numere naturale nenule.
Excepie face un singur numr care a fost
omis.
S se determine care numr lipsete.
06.12.2011

Programarea calculatoarelor

40

11.4. Probleme rezolvate


Exemplu:
SIR.TXT
2
4
5
1
Se va afia : 3
06.12.2011

Programarea calculatoarelor

41

11.4. Probleme rezolvate


#include<stdio.h>
#include<iostream.h>
FILE *f;
int suma = 0, nr=0, x, numar;
int main()
{
f = fopen(SIR.TXT,r);
06.12.2011

Programarea calculatoarelor

42

11.4. Probleme rezolvate


while( !feof(f) )
{
fscanf(f, %d\n, &x);
suma+=x;
nr++;
}
fclose(f);
numar=(nr+1)*(nr+2)/2 suma;
cout<<Numarul lipsa este: <<numar;
}
06.12.2011

Programarea calculatoarelor

43

06.12.2011

Programarea calculatoarelor

44

11.4. Probleme rezolvate


Problema 4:
Se citete un ir de numere ntregi din fiierul
NUMERE.TXT.
Fiierul conine:
pe primul rnd numrul n de elemente ale irului
apoi pe al doilea rnd elementele irului separate
prin spaii.

S se afieze primul i ultimul numr din ir.


06.12.2011

Programarea calculatoarelor

45

11.4. Probleme rezolvate


Exemplu:
NUMERE.TXT
7
-3 4 10 90 -9 11 15
Se vor afia valorile: -3 15
06.12.2011

Programarea calculatoarelor

46

11.4. Probleme rezolvate


#include<stdio.h>
#include<iostream.h>
FILE *f;
int i, n, x[100];
int main()
{
f = fopen(NUMERE.TXT,r);
fscanf(f, %d, &n);
06.12.2011

Programarea calculatoarelor

47

11.4. Probleme rezolvate


for(i=1; i<=n; i++)
fscanf(f, %d, &x[i]);
cout<<x[1]<< <<x[n]<<endl;
fclose(f);
}

06.12.2011

Programarea calculatoarelor

48

06.12.2011

Programarea calculatoarelor

49

11.4. Probleme rezolvate


Problema 5:
Se citesc numere ntregi din fiierul MATRICE.TXT.
Fiierul conine:
pe primul rnd numerele n i m, n reprezentnd cte linii se
afl n fiier ncepnd cu linia a doua, iar m reprezint cte
numere ntregi se afl pe fiecare linie
apoi ncepnd de pe al doilea rnd elementele unei matrice
separate prin cte un spaiu.

S se afieze cea mai mic i cea mai mare valoare


din matricea citit.
06.12.2011

Programarea calculatoarelor

50

11.4. Probleme rezolvate


Exemplu:
MATRICE.TXT
33
11 -3 6
0 8 -14
8 15 2
Se vor afia valorile: -14 si 15
06.12.2011

Programarea calculatoarelor

51

11.4. Probleme rezolvate


#include<stdio.h>
#include<iostream.h>
FILE *f;
int i, j, n, m, a[10][10], min, max;
int main()
{
f = fopen(MATRICE.TXT,r);
fscanf(f, %d %d, &n, &m);
06.12.2011

Programarea calculatoarelor

52

11.4. Probleme rezolvate

for(i=1; i<=n; i++)


for(j=1; j<=m; j++)
fscanf(f, %d, &a[i][j]);
fclose(f);

06.12.2011

Programarea calculatoarelor

53

11.4. Probleme rezolvate


min=a[1][1];
max=a[1][1];
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
if(a[i][j] < min) min = a[i][j];
if(a[i][j] > max) max = a[i][j];
}
cout<<min<< <<max;
}
06.12.2011

Programarea calculatoarelor

54

06.12.2011

Programarea calculatoarelor

55

11.4. Probleme rezolvate


Problema 6:
Se citete un ir de numere ntregi din fiierul
NUMERE.TXT.
Fiierul conine:
pe primul rnd numrul n de elemente ale irului
apoi pe fiecare din urmtoarele n rnduri cte un
element al irului.

S se afieze suma elementelor pozitive din ir.


06.12.2011

Programarea calculatoarelor

56

11.4. Probleme rezolvate


Exemplu:
NUMERE.TXT
5
6
7
-2
4
-10
Se va afia valoarea: 22
06.12.2011

Programarea calculatoarelor

57

11.4. Probleme rezolvate


#include<stdio.h>
#include<iostream.h>
FILE *f;
int i, n, x[100], suma=0;
int main()
{
f = fopen(NUMERE.TXT,r);
fscanf(f, %d, &n);
06.12.2011

Programarea calculatoarelor

58

11.4. Probleme rezolvate


for(i=1; i<=n; i++)
{
fscanf(f, %d\n, &x[i]);
if(x[i] > 0)
suma+=x[i];
}
fclose(f);
cout<<suma<<endl;

06.12.2011

Programarea calculatoarelor

59

06.12.2011

Programarea calculatoarelor

60

ntrebri?

06.12.2011

Programarea calculatoarelor

61

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