curs13-pc
DESCRIPTION
curs13-PCTRANSCRIPT
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 1/61
Programareacalculatoarelor
Universitatea “Constatin Brâncuşi” T ârgu-Jiu Facultatea de Inginerie
Departamentul de Automatic ă , Energie şi Mediu
Lect.dr. Adrian Runceanu
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 2/61
Curs 13
06.12.2011 Programarea calculatoarelor 2
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 3/61
Capitolul 11. Fişiere
11.1. Declarare. Operaţii cu fişiere
11.2. Prelucrarea fişierelor la nivel inferior11.3. Prelucrarea fişierelor la nivel superior
11.4. Probleme rezolvate
06.12.2011 Programarea calculatoarelor 3
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 4/61
11.1. Declarare. Operaţii cu fişiere.
Fişierul este o colecţie de informaţii ordonată în înregistrări.
06.12.2011 Programarea calculatoarelor 4
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 5/61
11.1. Declarare. Operaţii cu fişiere.
Fişierele pot fi de mai multe tipuri, în funcţie de datele ce se memorează în ele:
1. fişier text conţine doar caractere ASCII, iar
înregistrările sunt separate prin caracterelespeciale CR şi LF
2. fişier standard ( fişierul header ) este un fişier text
3. fişierul binar este un fişier ce conţine date înformat intern, iar înregistrările nu se maisepară prin caractere speciale
06.12.2011 Programarea calculatoarelor 5
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 6/61
11.1. Declarare. Operaţii cu fişiere.
1. Operaţii cu fişiere
Prezentăm în continuare operaţiile ce se
pot efectua cu fişiere în limbajul C:
• deschiderea unui fişier
• crearea unui fişier
•actualizarea unui fişier
• consultarea unui fişier
06.12.2011 Programarea calculatoarelor 6
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 7/61
11.1. Declarare. Operaţii cu fişiere.
• poziţionarea pe o anumită înregistrare din
fişier
• ştergerea unui fişier
• ştergerea de înregistrări din fişier
• redenumirea unui fişier
06.12.2011 Programarea calculatoarelor 7
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 8/61
11.1. Declarare. Operaţii cu fişiere.
Se cunosc două nivele de prelucrare afişierelor şi anume:
1. Nivelul inferior de prelucrare – se face apella funcţiile sistemului de operare MS-DOS(încorporat în SO Windows).
2. Nivelul superior de prelucrare – se folosescfuncţii specializate în lucrul cu fişierele.
06.12.2011 Programarea calculatoarelor 8
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 9/61
11.1. Declarare. Operaţii cu fişiere.
Observaţie:
În limbajul C++, nu există instrucţiuni deintrare/ieşire ci numai funcţii specializatepentru aceste operaţii. (funcții care
prelucrează stream-uri)
06.12.2011 Programarea calculatoarelor 9
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 10/61
Capitolul 11. Fişiere
11.1. Declarare. Operaţii cu fişiere
11.2. Prelucrarea fişierelor la nivel inferior11.3. Prelucrarea fişierelor la nivel superior
11.4. Probleme rezolvate
06.12.2011 Programarea calculatoarelor 10
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 11/61
11.2. Prelucrarea fişierelor la nivel inferior
Pentru a putea utiliza prelucrarea
fişierelor la nivel inferior , trebuie să includem
în program următoarele fişiere standard:<io.h>
<fcntl.h>
06.12.2011 Programarea calculatoarelor 11
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 12/61
11.2. Prelucrarea fişierelor la nivel inferior
a) Deschiderea unui fişier seefectuează pentru ca să se asociezefişierului de pe suportul fizic, un număr
întreg numit descriptor de fişier = [df ].
06.12.2011 Programarea calculatoarelor 12
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 13/61
11.2. Prelucrarea fişierelor la nivelinferior
Descriptorii pentru fişierele standard sunt:
DENUMIREFISIER
SEMNIFICATIE VALOAREDESCRIPTOR
stdin tastatura 0
stdout monitor 1
stderr fişier de erori 2
s t d p r n i m p r i m a n t ă 3
s t d a u x c o m u n i c a ţ i e s e r i a l ă 4
06.12.2011 Programarea calculatoarelor 13
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 14/61
11.2. Prelucrarea fişierelor la nivel inferior
Funcţia utilizată este open şi are următoarea sintaxă:
Unde:cale – este un pointer către o zonă de tip
caracter, zonă în care este specificată calea deacces către fişierul ce trebuie deschis;
Dacă descrierea completă a căii de acceslipseşte, atunci fişierul va fi căutat în directorulcurent.
06.12.2011 Programarea calculatoarelor 14
int open(const char *cale, int acces);
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 15/61
11.2. Prelucrarea fişierelor la nivel inferior
• acces - este o constantă predefinită care poateavea următoarele valori:
Se pot face şi combinaţii între aceste valori:O_RDONLY | O_WRONLY, sau O_RDONLY |
O_BINARY.06.12.2011 Programarea calculatoarelor 15
valoare semnificatie
O_RDONLY deschis doar pentru citireO_WRONLY deschis doar pentru scriereO_RDWR deschis pentru citire şi scriere O_APPEND deschis pentru adăugare la sfârşit O_TEXT deschidere fişier text
O_BINARY deschiderea fişier binar
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 16/61
11.2. Prelucrarea fişierelor la nivel inferior
Exemplu:Următoarea secvenţă de program se poate folosi pentru a
testa existenţa unui fişier 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ă funcţia open() poate fi:> 0, dacă fişierul a fost găsit -1, dacă fişierul nu a fost găsit
06.12.2011 Programarea calculatoarelor 16
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 17/61
11.2. Prelucrarea fişierelor la nivel inferior
b) Crearea unui fişier se efectuează cu ajutorul funcţiei
creat, care are următoarea sintaxă:
Unde:
cale – este un pointer către o zonă de tip caracter, zonă încare este specificată calea de acces către fişierul ce
trebuie deschisDacă descrierea completă a căii de acces lipseşte,
atunci fişierul va fi căutat în directorul curent.
06.12.2011 Programarea calculatoarelor 17
int creat(const char *cale, int mod);
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 18/61
11.2. Prelucrarea fişierelor la nivel inferior
• mod – este modul de acces la fişierul respectiv:
valorile returnate de funcţia creat sunt:> 0 – dacă fişierul poate fi creat
-1, în caz contrar
06.12.2011 Programarea calculatoarelor 18
valoare semnificatie
S_IREAD creat pentru citireS_IWRITE creat pentru scriereS_EXEC fişier executabi
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 19/61
11.2. Prelucrarea fişierelor la nivel inferior
Exemplu:Următoarea secvenţă de program se poate folosi pentru
testa existenţa unui fişier 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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 20/61
11.2. Prelucrarea fişierelor la nivel inferior
c) Citirea datelor dintr-un fişier se efectuează cuajutorul funcţiei read, care are următoarea
sintaxă:
Se citeşte secvenţial din fişierul desemnatde descriptorul de fişier df un număr de octeţi -lung care se depun la adresa desemnată de buf
06.12.2011 Programarea calculatoarelor 20
int read(int df, void *buf, int lung);
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 21/61
Capitolul 11. Fişiere
11.1. Declarare. Operaţii cu fişiere
11.2. Prelucrarea fişierelor la nivel inferior11.3. Prelucrarea fişierelor la nivel superior
11.4. Probleme rezolvate
06.12.2011 Programarea calculatoarelor 21
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 22/61
11.3. Prelucrarea fişierelor la nivel superior
Pentru a putea utiliza prelucrarea fişierelor la nivel superior, trebuie să includem în programurmătorul fişier standard: <stdio.h>.
a) Declararea unei variabile de tip fisier seefectueaza astfel:
06.12.2011 Programarea calculatoarelor 22
FILE *pointer_fisier;
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 23/61
11.3. Prelucrarea fişierelor la nivel superior
b) Deschiderea unui fişier se efectuează cu ajutorul functiei fopen:
Unde:• nume este adresa unui sir de caractere care definestenumele fisierului care se deschide
• mod este adresa unui sir de caractere care defineste modulde 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
FILE *fopen(const char *nume, const char *mod);
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 24/61
11.3. Prelucrarea fişierelor la nivel superior
Exemplu: Următoarea secvenţă de program se poatefolosi pentru testa existenţa unui fişier 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ă funcţia fopen poate fi:
• adresa variabilei de tip fisier, dacă fişierul a fost găsit,
• sau -1, dacă fişierul nu a fost găsit. 06.12.2011 Programarea calculatoarelor 24
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 25/61
11.3. Prelucrarea fişierelor la nivel superior
Transferul unui caracter in sau dintr-un fisier textse efectuează cu ajutorul funcţiilor putc() si getc(), careau următoarele sintaxe:
• Functia putc() scrie caracterul cu codul ASCII c infisierul 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
int putc(int c, FILE *f);int getc(FILE *f);
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 26/61
11.3. Prelucrarea fişierelor la nivel superior
• Transferul unui şir de caractere în sau dintr-un fişier text se realizează folosind funcţiile
fgets() şi fputs() care au următoarele sintaxe:
06.12.2011 Programarea calculatoarelor 26
char fgets(char *s, int n, FILE *f);
int fputs(const char *s, FILE *f);
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 27/61
11.3. Prelucrarea fişierelor la nivel superior
• Citiri/scrieri cu format se realizează cufuncţiile fscanf() şi fprintf() care permit citirea
respectiv scrierea în fişier şi care auurmătoarele sintaxe:
06.12.2011 Programarea calculatoarelor 27
int fscanf(FILE *f, const *format, . . .);
int fprintf(FILE *f, const *format, . . .);
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 28/61
11.3. Prelucrarea fişierelor la nivel superior
• Închiderea unui fişier se realizează cu ajutorulfuncţiei fclose() care are următoarea sintaxă:
06.12.2011 Programarea calculatoarelor 28
int fclose(FILE *f);
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 29/61
Capitolul 11. Fişiere
11.1. Declarare. Operaţii cu fişiere.
11.2. Prelucrarea fişierelor la nivel inferior11.3. Prelucrarea fişierelor la nivel superior
11.4. Probleme rezolvate
06.12.2011 Programarea calculatoarelor 29
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 30/61
11.4. Probleme rezolvate
Problema 1:
Un program care citeşte un şir de numere
de la tastatură şi apoi scrie în fişierul "FISIER3.DAT", pe o linie, câte două numereconsecutive, inserând între ele suma lor.
06.12.2011 Programarea calculatoarelor 30
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 31/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 32/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 33/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 34/61
06.12.2011 Programarea calculatoarelor 34
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 35/61
11.4. Probleme rezolvate
Problema 2:
Se citeşte un şir de numere întregi din fişierul
“NUMERE.TXT”.Fişierul conţine:
– pe primul rând numărul n de elemente ale şirului
– apoi pe al doilea rând elementele şirului separateprin spaţii.
Să se afişeze elementele pare din şir.
06.12.2011 Programarea calculatoarelor 35
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 36/61
11.4. Probleme rezolvate
Exemplu:
NUMERE.TXT
56 7 -2 4 11
Se vor afişa valorile: 6 -2 4
06.12.2011 Programarea calculatoarelor 36
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 37/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 38/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 39/61
06.12.2011 Programarea calculatoarelor 39
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 40/61
11.4. Probleme rezolvate
Problema 3:
În fişierul “SIR.TXT” există pe fiecare linie
câte un număr din şirul primelor n (n<300)numere naturale nenule.
Excepţie face un singur număr care a fost
omis.Să se determine care număr lipseşte.
06.12.2011 Programarea calculatoarelor 40
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 41/61
11.4. Probleme rezolvate
Exemplu:
SIR.TXT
24
5
1
Se va afişa : 3
06.12.2011 Programarea calculatoarelor 41
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 42/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 43/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 44/61
06.12.2011 Programarea calculatoarelor 44
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 45/61
11.4. Probleme rezolvate
Problema 4:
Se citeşte un şir de numere întregi din fişierul
“NUMERE.TXT”.Fişierul conţine:
– pe primul rând numărul n de elemente ale şirului
–
apoi pe al doilea rând elementele şirului separateprin spaţii.
Să se afişeze primul şi ultimul număr din şir.
06.12.2011 Programarea calculatoarelor 45
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 46/61
11.4. Probleme rezolvate
Exemplu:
NUMERE.TXT
7
-3 4 10 90 -9 11 15
Se vor afişa valorile: -3 15
06.12.2011 Programarea calculatoarelor 46
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 47/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 48/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 49/61
06.12.2011 Programarea calculatoarelor 49
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 50/61
11.4. Probleme rezolvate
Problema 5:
Se citesc numere întregi din fişierul “MATRICE.TXT”.
Fişierul conţine: – pe primul rând numerele n şi m, n reprezentând câte linii se
află în fişier începând cu linia a doua, iar m reprezintă câtenumere întregi se află pe fiecare linie
– apoi începând de pe al doilea rând elementele unei matrice
separate prin câte un spaţiu.Să se afişeze cea mai mică şi cea mai mare valoare
din matricea citită.
06.12.2011 Programarea calculatoarelor 50
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 51/61
11.4. Probleme rezolvate
Exemplu:
MATRICE.TXT
3 311 -3 6
0 8 -14
8 15 2
Se vor afişa valorile: -14 si 15
06.12.2011 Programarea calculatoarelor 51
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 52/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 53/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 54/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 55/61
06.12.2011 Programarea calculatoarelor 55
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 56/61
11.4. Probleme rezolvate
Problema 6:
Se citeşte un şir de numere întregi din fişierul
“NUMERE.TXT”.Fişierul conţine:
– pe primul rând numărul n de elemente ale şirului
– apoi pe fiecare din următoarele n rânduri câte unelement al şirului.
Să se afişeze suma elementelor pozitive din şir.
06.12.2011 Programarea calculatoarelor 56
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 57/61
11.4. Probleme rezolvate
Exemplu:
NUMERE.TXT
5
67
-2
4
-10
Se va afişa valoarea: 22
06.12.2011 Programarea calculatoarelor 57
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 58/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 59/61
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
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 60/61
06.12.2011 Programarea calculatoarelor 60
7/18/2019 curs13-PC
http://slidepdf.com/reader/full/curs13-pc 61/61
Întrebări?