Upload
adriana
View
265
Download
0
Embed Size (px)
8/8/2019 Programarea Calculatoarelor M8
1/12
Programarea Calculatoarelor(limbajul C)
Curs 8 Lucrul cu pointeri ifiiere de date
Universitatea Politehnica din BucuretiFacultatea de Electronic, Telecomunicaii i
Tehnologia Informaiei
.l. Bogdan IONESCUProf. Drago BURILEANUProf. Claudius DAN
2010-20112
Cuprins
8.1. Lucrul cu pointeri
8.2. Lucrul cu fiiere de date
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 1/66
3Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 2/66
8.1. Lucrul cu pointeri
4Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 3/66
Ce reprezint un pointer ?
> Pentru a nelege noiunea de pointer vom relua n discuienoiunea de variabil.
> Variabil = un container sau o zon de memorie n caresunt stocate anumite valori.
2009
> Zona de memorie nu este oarecare, ci aceasta are o anumitadres unic (un numr) pe baza creia se poate face referinla ea.
2567843
valoarea variabilei
adresa de memorie
> Variabila este identificat printr-un nume alfanumeric unic.
VarA
nume
5Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 4/66
Ce reprezint un pointer ? (continuare)
2009
2567843
valoarea variabilei
adresa de memorie
VarA
nume
Ce se ntmpl dac scriem:
printf(%d, VarA);
Dar dac scriem:
printf(%d, &VarA);
>2009
>2567843
VarA indic
valoarea
&VarA indic
adresa
6Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 5/66
Ce reprezint un pointer ? (continuare)
> Un pointer este tot o variabil, adic o locaie de memorie.
> Acesta difer de variabilele clasice prin faptul c, n loc sstocheze valori, acesta stocheaz doar adrese ale locaiilordin memorie.
> De aici i denumirea de pointer indicator, prin intermediuladresei pe care o stocheaz, putem spune c acesta indicspre coninutul unei alte locaii de memorie.
PointerA
2009
2567843
adresa variabilei pointer
10000
2567843PointerA
valoarea pointerului
8/8/2019 Programarea Calculatoarelor M8
2/12
7Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 6/66
Lucrul cu pointeri
> Pointerii constituie fundamentul limbajului C, acetia oferindo multitudine de avantaje:
- rapiditate n manipularea datelor, exemplu: vrem s
copiem valorile vectorului A n vectorul B, folosindpointerii este suficient s stocm adresa primului elementdin A n adresa primului element din B,
- eficientizare a memoriei, variabilele definite ca pointeripot fi alocate dinamic: se aloc cnd vrem, ct vrem ict timp vrem (se poate elibera memoria),
- anumite calcule nu pot fi exprimate dect pe bazapointerilor,
8Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 7/66
Lucrul cu pointeri (continuare)
> Avantaje (continuare):
- o funcie poate returna mai multe valori cu ajutorulpointerilor, returnnd astfel adresa la care se gsesc
acestea (de exemplu, adresa de nceput a unui vector)- transmiterea valorilor prin adres (pointer) nfuncii permite modificarea valorilor acestora, ceea ce nueste valabil cnd parametrul funciei este transmis prinvaloare (cazul clasic),
- etc.
> Principalul dezavantaj este dat manipularea acestora, cenecesit anumite precauii, anumite greeli de manipularenefiind sesizate de compilator !!!
9Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 8/66
Lucrul cu pointeri (continuare)
> n limbajul C studiat pn n acest punct, ai lucrat deja cupointeri, i anume la:
- lucrul cu vectori i matrice,
- lucrul cu funcii.
- lucrul cu iruri de caractere,
- lucrul cu structuri de date i uniuni,
*;
> Modul de definire al unui pointer:
> Efect: variabila va fi un pointer ce indic olocaie de memorie ce stocheaz valori de tip .
10Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 9/66
Lucrul cu pointeri (continuare)
int *PointerInt;double *PointerReal;
> Exemple:PointerInt va conine adresa uneilocaii de memorie ce stocheaz
ntregi (32 bii),PointerReal va conine adresa uneilocaii de memorie ce stocheazdouble (64 bii),
> Atenie: tipul datelor indicate este specificat tocmai pentru c
acestea sunt stocate diferit, astfel nu putem suprapune undouble peste int.
> Care sunt ustensilelede care dispunem n lupta cu pointerii:- operatorul unar& = adresa unei variabile,
- operatorul de indirectare * = coninutul obiectului indicatde pointer (coninutul de la adresa stocat de pointer).
11Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 10/66
Lucrul cu pointeri (continuare)
int x=1, y=2;int *ip;
> Exemplu utilizare pointeri:
adr.100
x
1
adr.200
y
2
adr.1000
ip
?*!#
> Efect:- la adresa variabilei x (ex.100) am pus valoarea 1,
- la adresa lui y (ex. 200) am pus valoarea 2,
- la adresa pointerului ip (ex. 1000) am pus valoarea ???
> Cnd un pointer este declarat, nu conine o adres valid,
de regul indic ctre o zon de memorie care, de cele maimulte ori nici nu aparine programului.
> Dup declarare, precum variabilele,pointerul trebuie iniializat.
adr.100 adr.200 adr.1000
x y ip
1 100
12Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 11/66
Lucrul cu pointeri (continuare)
> Exemplu utilizare pointeri (continuare):
ip=&x;
adr.1000
ip
adr.100 adr.200
x y
1 2 100
> Traducere: la adresa de memorie a variabilei pointerip seva stoca adresa (dat de operatorul &) variabilei x.
pointerul ip indic acum ctre variabila x.
y=*ip; 1
> Traducere: variabila y preia valoarea de la adresa stocat npointerul ip sau cu alte cuvinte, coninutul obiectului indicat deip (returnat de operatorul *).
???
???
8/8/2019 Programarea Calculatoarelor M8
3/12
adr.100 adr.200 adr.1000
2
x y ip
adr.100 adr.200 adr.1000
2 100
x y ip
13Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 12/66
Lucrul cu pointeri (continuare)
> Exemplu utilizare pointeri (continuare):
x=ip; 100
> Traducere: variabila x va lua valoarea variabilei pointerip, ianume adresa coninut de aceasta, care este adresa lui x.
*ip=3; 3 100
> Traducere: coninutul obiectului indicat de pointerul ip, ianume locaia de memorie de la adresa 100 va primi valoarea 3.
variabila x are valoarea 3 (echivalent x=3).
???
???
14Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 13/66
Lucrul cu pointeri (continuare)
> Recapitulare:
int *ip;
ipnseamn:coninutul variabilei pointer ip i anumeo adres la o variabil de tip ntreg.
&ipnseamn:adresa din memorie a variabilei pointer ipi anume locaia unde stocheaz adresele
*ipnseamn:coninutul obiectului indicat de pointer ianume coninutul locaiei de memorie dela adresa memorat de pointer (adr. ip)
adr.A adr.B
ip x
15Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 14/66
Aritmetica pointerilor
> Fiind variabile, pointerii permit efectuarea a o serie deoperaii specifice variabilelor.
int *ip;*ip=100;
Care este efectul acestor instruciuni ?
adr.
ip
?*!#
adr. ?*!#
100
> Greeal tipic: un pointer trebuie iniializat, deoarece altfeleste posibil s indice o locaie inaccesibil.
Corect ar fi:
int *ip, x;ip=&x;*ip=100;
adr.B 100
char*mychar;short *myshort;long *mylong;
16Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 15/66
Aritmetica pointerilor (continuare)
> Exemplu 1*:
*http://www.cplusplus.com/doc/tutorial/pointers.html
- mycharindic o locaie de memorie pe8 bii (1 byte),- myshort indic o locaie de memoriepe 16 bii (2 bytes),- mylong indic o locaie de memorie pe32 bii (4 bytes),
mychar++;
myshort++;mylong++;
mychar=1000;
myshort=2000;mylong=3000;
17Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 16/66
Aritmetica pointerilor (continuare)
> Exemplu 2:
int *p, x;p=&x;*p++=10;
- p este un pointer care indic variabilantreag x.
>Atenie: operatorii ++ i -- au prioritate mai mare dectoperatorul * (vezi Cursul 5).
> Astfel, *p++ este echivalent cu *(p++).
p p++
adr.A
8 bii
adr.A+1
8 bii
x
8 bii 8 bii
adr.A+2 adr.A+3
8 bii
adr.A+4
18Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 17/66
Aritmetica pointerilor (continuare)
> Exemplu 2 (continuare)
adr.A
8 bii
adr.A+1
8 bii
p
x
8 bii 8 bii
adr.A+2 adr.A+3
p++
10
adr.A+4
> Teoretic, *(p++)=10 se traduce prin:
- p nu mai are ca valoare adresa lui x (adr. A) ci p++, ianume adresa p+4bytes (adr.A+4).
- la adresa stocat la adr.A+4 se va pune valoarea 10.
> Practicam omis faptul c p++ este o incrementare post:
- la adresa stocat n p se va pune valoarea 10.
- dup aceasta, p este incrementat i indic adr.A+4.
8/8/2019 Programarea Calculatoarelor M8
4/12
int *p, x=15;p=&x;(*p)++;
adr.A adr.B
p x
adr.B 15+1
adr.A adr.B
p x
adr.A adr.B
p x
19Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 18/66
Aritmetica pointerilor (continuare)
> Exemplu 3:
??? 15
adr.B 15
> (*p)++ coninutul locaiei de memorie indicate de p este mritcu 1, echivalent cu x++.
20Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 19/66
Aritmetica pointerilor (continuare)
> Exemplu 4:
int numere[5], n;int *p;p=numere;
*p=10;p++;
*p=20;p=&numere[2];*p=30;p=numere + 3;
*p=40;p=numere;
*(p+4)=50;for(n=0; n Exemplu 4 (cont.)
int numere[5], n;int *p;p=numere;
*p=10;p++;
*p=20;p=&numere[2];*p=30;p=numere + 3;
*p=40;p=numere;
*(p+4)=50;for(n=0; n Exemplu 4 (cont.)
int numere[5], n;int *p;p=numere;
*p=10;p++;
*p=20;p=&numere[2];*p=30;p=numere + 3;
*p=40;p=numere;
*(p+4)=50;for(n=0; n n general, n limbajul C, parametrii unei funcii sunt transmiiprin valoare.
funcia apelat primete o copie a variabilei, adic valoareavariabilei copiat la o alt adres de memorie dect ceaa variabilei originale
> Exemplu:
void schimba(int a, int b);
variabilele a i b sunt transmiseprin valorile acestora, deci nuvor fi modificate de funcie.
> O alt modalitate de transmitere a parametrilor este prinreferin sau adres.
funcia apelat primete o copie a adresei variabilei ceconine parametrul efectiv (un pointer).
24Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 23/66
Pointeri i funcii (continuare)
> Exemplu:
void schimba(int *pa, int *pb);
funcia primete dou valori deadrese ce corespund locaiilorla care se afl variabilele cevrem s le modificm.
void schimba(int *pa, int *pb){
int tmp;tmp=*pa;*pa=*pb;*pb=tmp;
}
funcia interschimb valorile adou variabile de tip intreg.
tmp preia coninutul locaiei dememorie indicat de pa (*pa),
coninutul lui pa (*pa) preiaconinutul lui pb (*pb),
coninutul lui pb (*pb) iavaloarea tmp.
> Detaliu funcie:
8/8/2019 Programarea Calculatoarelor M8
5/12
adr.pa adr.pb
pa pb
1.
adr.a adr.b
a b
int main()
{int a=3, b=6;schimba( );
}
25Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 24/66
Pointeri i funcii (continuare) void schimba(int *pa, int *pb){
int tmp;tmp=*pa;*pa=*pb;*pb=tmp;
}
adr.a adr.b
> Cum apelm funcia din
programul principal ?
&a, &b > S vedem ce se ntmpl n
memorie ?
3 6
adr.pa adr.pb
pa pb
3.
adr.a adr.b
a b
adr.tmp
tmp
adr.pa adr.pb
pa pb
2.
adr.a adr.b
a b
adr.tmp
tmp
26Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 25/66
Pointeri i funcii (continuare) void schimba(int *pa, int *pb){
int tmp;tmp=*pa;*pa=*pb;*pb=tmp;
}
adr.a adr.b
int main(){int a=3, b=6;schimba( );
}
&a, &b
3 6 ???
adr.a adr.b3 6 3
adr.pa adr.pb
pa pb
5.
adr.a adr.b
a b
adr.tmp
tmp
adr.pa adr.pb
pa pb
4.
adr.a adr.b
a b
adr.tmp
tmp
27Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 26/66
Pointeri i funcii (continuare) void schimba(int *pa, int *pb){
int tmp;tmp=*pa;*pa=*pb;*pb=tmp;
}
adr.a adr.b
int main(){
int a=3, b=6;schimba( );
}&a, &b
6 6 3
adr.a adr.b6 3 3
28Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 27/66
8.2. Lucrul cu fiiere de date
29Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 28/66
Fiiere de date
> Datele folosite la un moment dat, n timpul execuiei unuiprogram sunt stocate temporarn memoria intern (ex. RAM);
> Datele ce sunt pstrate pe termen lung sunt stocate
permanentn memoria extern (ex. HDD);
informaie brut
00010100101100011010111111000100111101100001111111
program: Windows 7 Explorer
preluate n memoria RAM cnd sunt folosite;
computer management Windows XP
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 29/66
Fiiere de date (continuare)
Pentru a putea accesa informaia de pe dispozitivele externede stocare aceasta trebuie indexat sau organizat;
A. unitile fizice sunt mprite (opional) la nivel logic (nu fizic)
n partiii ce sunt desemnate prin litere, ex. C:, D:, F: etc.
Disc-0
Disc-1
C:29.29GB
D:119.75GB
G:960MB
H:1.95GB
Disc-2
8/8/2019 Programarea Calculatoarelor M8
6/12
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 30/66
Fiiere de date (continuare)
Pentru a putea accesa informaia de pe dispozitivele externede stocare aceasta trebuie indexat sau organizat;
B. informaia stocat pe fiecare unitate logic (partiie) este
organizat ierarhic (arborescent):
nivelul rdcinROOT
C:29.29GB
fiiere = colecii de date stocateunitar i identificate prin:.
.txt .doc .pdf .bmp .cpp .mpg
identificatoralfanumeric
~3 litere ce descriutipul coninutului;
------------------------
...
------------.exe
.com
.bat
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 31/66
Fiiere de date (continuare)
Pentru a putea accesa informaia de pe dispozitivele externede stocare aceasta trebuie indexat sau organizat;
B. informaia stocat pe fiecare unitate logic (partiie) este
organizat ierarhic (arborescent):
nivelul rdcinROOT
C:29.29GB
------------
------------
------------windowswindows
directoare = colecii de fiiere i/saudirectoare (sunt identificate prin nume)
------------...
...
nivelul 3
------------
------------myimgmyimg
------------
------------myvideomyvideo
------------
------------
------------mydocmydoc
...
...
nivelul 1 nivelul 2 nivelul N
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 32/66
Fiiere de date (continuare)
> Exemplu:
partiii (C:,D:, E: ...)
directoare,ex.
WINDOWS
sub-directoare,ex. system
fiiere, ex.explorer.exe
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 33/66
Fiiere de date (continuare)
> Cum facem referire la un anumit fiier dintr-un anumit director,de exemplu fiierul explorer.exe ?
definim calea ctreacesta (path):
c:\windows\explorer.exe
> / marcheaz con.directorului curent;
E:\
windows\
explorer.exe
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 34/66
Manipularea fiierelor n C
> Citirea - scrierea datelor n fiiere reprezint de fapt operaiide intrare (datele sunt preluate din fiier = input) ieire (datelesunt stocate pe HDD = output);
> Uneori este avantajos s prelum datele direct dintr-un fiier,astfel nefiind necesar intervenia utilizatorului:
volum mare de date de intrare;
datele de intrare sunt aceleai la fiecare rulare (ex. teste);
datele de intrare sunt furnizate de un alt programindependent de utilizator ...
> Similar, datele de ieire ale programului pot fi stocate:
rmn disponibile dup ncheierea programului;
pot fi folosite ca date de intrare pentru alt program ...
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 35/66
Manipularea fiierelor n C (continuare)
> Limbajul de programare C pune la dispoziia programatoruluiurmtoarele operaii de lucru cu fiiere de date:
- crearea i denumirea fiierelor;
- deschiderea unui fiier pentru manipulare date;
- scrierea datelor ntr-un fiier (creare fiier nou sauadugare de date la un fiier existent);
- citirea coninutului unui fiier (secvenial, aleator);
- nchiderea fiierului;
> funciile se gsesc n biblioteca stdio.h
8/8/2019 Programarea Calculatoarelor M8
7/12
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 36/66
Manipularea fiierelor n C (continuare)
> Un f iier este refereniat printr-o variabil pointer:
FILE *fisier1;FILE *fisier2;
fisier1 este un pointer la o structur de tipfiier de date,fisier2 este un alt pointer la o structur detip fiier de date.
> Ca i n cazul pointerilor, fiierele trebuie iniializate i anumele trebuie asociat un fiier fizic de pe dispozitivul de stocare:
FILE *fopen(const char*nume_fisier, const char*mod);
returneaz unpointer la fiier.
se specific modulde deschidere alfiierului
se specific numelefiierului i caleaacestuia.
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 37/66
Manipularea fiierelor n C (continuare)
modul de deschidere al fiierului:
FILE *fopen(const char*nume_fisier, const char*mod);
- r (read only) permite deschiderea unui fiier doarpentru a fi citit coninutul acestuia,
- w (write) creaz un fiier gol n care se pot scrie date.Dac fiierul cu acest nume exist deja, coninutul acestuiaeste ters!
- a (append) deschide fiierul menionat pentru aaduga date n continuarea celor existente. Dac fiierul nuexist acesta este creat.
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 38/66
Manipularea fiierelor n C (continuare)
modul de deschidere al fiierului (continuare):
FILE *fopen(const char*nume_fisier, const char*mod);
- r+ deschide un fiier pentru actualizarea datelor,permind att scriere ct i citire,
- w+ creaz un fiier nou n care se vor putea scrie cti citi date. Dac exist un fiier cu acelai nume atunciconinutul acestuia este ters.
- a+ deschide un fiier pentru adugare de date ct ipentru citire. Toate operaiile de scriere vor fi efectuateexclusiv n continuarea datelor existente (protejare coninutiniial). Dac fiierul nu exist atunci va fi creat.
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 39/66
Manipularea fiierelor n C (continuare)
> Exemplul 1:
FILE *fisier;fisier=fopen(c:\\test.txt, w);
- fisiereste un pointer la unobiect de tip FILE,
> Observaie: modurile de deschidere enunate anterior serefer la fiiere de tip text (coninut alfanumeric), pentru fiierebinare se adaug caracterul b;
- se creaz fiierul test.txtla locaia specificat, ianume pe partiia c:(director rdcin) i sereturneaz controlul pentruscriere la pointerul fisier.
De ce apare \\ ?
backslash este un caracterspecial, comanda \ + \ = \ !
if(fisier==NULL)printf(Fisierul nu a putut fi creat);
dac pointerul este nul(nu indic nimic) problem la deschidere!
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 40/66
Manipularea fiierelor n C (continuare)
> Exemplul 2:
FILE *fisier;fisier=fopen(c:\\Demo\\Tmp\\test.txt, w);
unde este creat fiierul ?
c:\Demo\Tmp\test.txt> Exemplul 3:
FILE *fisier;fisier=fopen(test.txt, w);
dar acum ?
n directorul curent
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 41/66
Manipularea fiierelor n C (continuare)
> Dup folosire un fiier trebuie nchis (eliberare flux de date):
int *fclose(FILE *fisier); - nchide fluxul de date deservitde pointerul fiier,- dac operaia este reuit sereturneaz codul 0.
> Exemplu complet:
FILE *fisier;
fisier=fopen(c:\\proba\\test.txt, w);if(fisier==NULL)printf(Fisierul nu a putut fi creat);
else{ ... fclose(fisier); }
8/8/2019 Programarea Calculatoarelor M8
8/12
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 42/66
Manipularea fiierelor n C (continuare)
> Scrierea datelor n fiier:
> Funcia fprintffuncioneaz identic ca funcia printfdoar cdatele nu sunt afiate pe ecran, ci salvate ntr-un fiier text;
intintintint fprintf(FILE *fisier, const char*format, a, b, 15, ... );
format (ir de caractere)specific modul deafiare (formatare) ct itipul datelor afiate
dup , se specificvariabilele sau
constanteleanunate n format.
fisierestepointerul cerefereniazconinutulfiierului
> Fiierul text poate fi vzut ca o imagine a datelor de pe ecran(acestea sunt salvate identic, pstrnd modul de formatare);
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 43/66
Manipularea fiierelor n C (continuare)
> Exemplul 1:
FILE *fisier;int v=20; float i=1.8; charnume[20], prenume[20];
printf(Nume=); scanf(%s,nume);printf(Prenume=); scanf(%s,prenume);
fisier=fopen(c:\\test.txt, w);fprintf(fisier, #Date personale#\n);fprintf(fisier, Nume=%s\n,nume);fprintf(fisier, Prenume=%s\n,prenume);fprintf(fisier, Varsta=%d\n,v);fprintf(fisier, Inaltime=%.2f\n,i);fprintf(fisier, #sfarsit#);fclose(fisier);
c:\> Nume=Vlad (enter)Prenume=Ionescu (enter)
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 44/66
Manipularea fiierelor n C (continuare)
> Exemplul 2:
FILE *fisier;int matrice[20][20], dim, i, j;
printf(Dim=); scanf(%d,&dim);CitireMatrice(matrice, dim); // functie definita anterior
fisier=fopen(c:\\test.txt, w);fprintf(fisier, %d\n, dim);
for(i=0
;i Exemplul 3:
FILE *fpar, *fimpar;int vect[100], dim, i;
printf(Dim=); scanf(%d,&dim);for(i=0; i Exemplul 3: continuare
FILE *fpar, *fimpar;int vect[100], dim, i;// citire vector// scriere vector in fisierfpar=fopen(c:\\par.txt, a);fimpar=fopen(c:\\impar.txt, a);
fprintf(fpar,-sfarsit-);fprintf(fimpar,-sfarsit-);
fclose(fpar);fclose(fimpar);
- am deschis fiierele de date nmodul de adugare de informaii(append) ???- fiierele par.txt i impar.txt nuexist vor fi create.
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 47/66
Manipularea fiierelor n C (continuare)
> Exemplul 3: corect
FILE *fpar, *fimpar;int vect[100], dim, i;// citire vector// scriere vector in fisierfpar=fopen(c:\\pare.txt, a);fimpar=fopen(c:\\impare.txt, a);
fprintf(fpar,-sfarsit-);fprintf(fimpar,-sfarsit-);
fclose(fpar);fclose(fimpar);
- fiind n modul de adugare,textul va fi scris n continuareadatelor existente deja n fiier.
8/8/2019 Programarea Calculatoarelor M8
9/12
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 48/66
Manipularea fiierelor n C (continuare)
PEnun: S se defineasc o structur de date ce permitestocarea urmtoarelor informaii relative la o persoan:nume, prenume, vrst, adres, telefon, email. S serealizeze o funcie ce permite citirea acestor date pentruelevii unei clase de liceu. S se exporte datele obinutentr-un fiier denumit astfel: DateEleviClasa_.txt,unde va fi specificat de utilizator.
Variabile de intrare/lucru:
struct elev;Variabile de ieire:
FILE *fisier;
int NrElevi, i;charnumec[10];
> Scrierea datelor n fiiere:
struct elev clasa[40]; Funcii:CitireDateClasa;ExportDateFisier;
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 49/66
Manipularea fiierelor n C (continuare)
#include #include #include // biblioteca de lucru cu siruri de caractere
struct elev{charnume[100], prenume[100], adresa[200], telefon[14], email[100];int varsta;
} clasa[40];
void CitireDateClasa(struct elev clasa[40], int NrElevi);void ExportDateFisier(FILE *fisier, charnumefisier[20],
struct elev clasa[40], charnumec[10], int NrElevi);int main(){int i, NrElevi;charnumec[10], numefisier[100];FILE *fisier;
printf("Date de intrare\nNumar elevi="); scanf("%d",&NrElevi);printf("Numele clasei="); scanf("%s",numec); continuare
> Programul principal:
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 50/66
Manipularea fiierelor n C (continuare)
continuare
int main(){
// citire date eleviCitireDateClasa(clasa, NrElevi);
// generare nume fisier care sa contina numele clasei// c:\+DateEleviClasa_++.txt
strcpy(numefisier,"c:\\DateEleviClasa_");strcat(numefisier,numec);strcat(numefisier,".txt");
// exportare date clasa in fisierul denumit numefisierExportDateFisier(fisier, numefisier, c lasa, numec, NrElevi);
}
> Programul principal (continuare):
- copiaz irul de caractere dindreapta n variabila ir decaractere din stnga (numefisier);
- concateneaz dou iruri decaractere i le stocheaz nvariabila din stnga (numefisier);
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 51/66
Manipularea fiierelor n C (continuare)
void CitireDateClasa(struct elev clasa[40], int NrElevi){int i;
for(i=0; i Funcia CitireDateClasa:
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 52/66
Manipularea fiierelor n C (continuare)
void ExportDateFisier(FILE *fisier, charnumefisier[20], struct elev clasa[40],charnumec[10], int NrElevi)
{int i;fisier=fopen(numefisier,"w");
if(fisier==NULL) { printf("Eroare, fisierul nu a putut fi creat!"); return; }else{
fprintf(fisier, "#Date elevi clasa %s\n", numec);fprintf(fisier, "Numar total elevi %d\n", NrElevi);for(i=0; i Funcia ExportDateFisier:
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 53/66
Manipularea fiierelor n C (continuare)
> Citirea datelor dintr-un fiier:
> Funcia fscanffuncioneaz identic ca funcia scanfdoar cdispozitivul de intrare nu este tastatura ci fiierul de date;
intintintint fscanf(FILE *fisier, const char*format, &a, &b, ... );
format (ir de caractere)specific tipul datelor cevor fi citite din fiier.
dup , se specificunde vor fi stocate
datele citite (adresede memorie).
fisierestepointerul cerefereniazconinutulfiierului
> Funcia fscanfreturneaz fie numrul de obiecte citite corect(variabile) sau n cazul n care datele nu pot fi citite returneazEOF (= sfrit de fiier).
8/8/2019 Programarea Calculatoarelor M8
10/12
> Exemplul 1: avem la dispoziie fiierul
FILE *fisier;charlinie[256];
int stop;fisier= fopen(c:\\test.txt,r);do{stop=fscanf(fisier,%s,linie);if(stop!=EOF)printf(am citit:%s\n,linie);
} while (stop!=EOF);fclose(fisier);
- se citete progresiv cte unir de caractere pn cndfuncia fscanfreturneaz EOF(ajunge la captul fiierului).- pe msur ce se citesc date,poziia curent n fiier semodific;
c:\>am citit:#DatePersonale#
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 54/66
Manipularea fiierelor n C (continuare)
- se deschide fiierul de datedorit n modul de citire (read);
am citit:Nume=Vladam citit:Prenume=Ionescuam citit:Varsta=20am citit:Inaltime=1.80
EOF
am citit:#sfarsit#
> Exemplul 2: avem la dispoziie fiierul
FILE *fisier;charlinie[256];
int stop;fisier= fopen(c:\\test.txt,r);do{stop=fscanf(fisier,%s,linie);if(stop!=EOF)printf(am citit:%s\n,linie);
} while (stop!=EOF);fclose(fisier);
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 55/66
Manipularea fiierelor n C (continuare)
- cum este citit textul n acestcaz ? (indicaie: analogie citireiruri de caractere cu scanf)
c:\>am citit:#Date
EOF
am citit:Personale#am citit:Nume=Vladam citit:Prenume=Ionescuam citit:Varsta=20...
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 56/66
Manipularea fiierelor n C (continuare)
> Pentru a citi fiierul ca un ir de caractere avem nevoie de uncontrol mai fin a ceea ce citim:
> Funcia fgetc returneaz caracterul din poziia curent la carese citete din fiier, iar dup aceasta avanseaz automat cu uncaracter (efect similar funciei getc).
intintintint fgetc(FILE *fisier); fisiereste pointerul cerefereniaz coninutul fiierului
> Avem la dispoziie fiierul text urmtor:
> textul de fapt arat aa:
124\nSa se citeasca acesttext linie cu linie.\nAceastaeste linia 2 urmata\nde linia3 si asa mai departe.EOF
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 57/66
Manipularea fiierelor n C (continuare)
> Exemplul 3: vom citi progresiv caractere de la inceputulfiierului pn cnd ntlnim EOF:
FILE *fisier; charc, linie[256]; int pos=0;
fisier=fopen(c:\\test.txt,r);
do{ c=fgetc(fisier);
if((c!='\n') && (c!=EOF))linie[pos++]=c;
else
{ linie[pos]='\0';printf(%s\n,linie);pos=0; }
} while (c!=EOF);
fclose(fisier);
- linie stocheaz la unmoment dat o linie din fiier;-pos va memora poziiacurent n linie;
- citim din fiier un caractercct timp nuam ajuns la captul fiierului;
- dac cnu este sfrit de linie i nici de
fiier atunci il adugm la line pepos;- dac ceste sfrit de linie sau de fiieratunci nseamn c am obinut o liniecomplet afim pe ecan;
FILE *fisier; charc, linie[256]; int pos=0;
fisier=fopen(c:\\test.txt,r);
do{ c=fgetc(fisier);
if((c!='\n') && (c!=EOF))linie[pos++]=c;
else{ linie[pos]='\0';
printf(%s\n,linie);pos=0; }
} while (c!=EOF);
fclose(fisier);
iteraia 1: c=1, linie=1
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 58/66
Manipularea fiierelor n C (continuare)
> Cum se execut:
iteraia 7: c= , linie=Sa iteraia 8: c=s, linie=Sa s
iteraia 2: c=2, linie=12iteraia 3: c=4, linie=124iteraia 4: c=\n, linie=124\0iteraia 5: c=S, linie=Siteraia 6: c=a, linie=Sa
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 59/66
Manipularea fiierelor n C (continuare)
FILE *fisier; charc, linie[256]; int pos=0;
fisier=fopen(c:\\test.txt,r);
do{ c=fgetc(fisier);
if((c!='\n') && (c!=EOF))linie[pos++]=c;
else{ linie[pos]='\0';
printf(%s\n,linie);pos=0; }
} while (c!=EOF);
fclose(fisier);
> Dup citirea linie cu line vrem s citim numrul de la nceputulfiierului, astfel:
- n urma citirii pas cu pas nacest punct poziionarea n fiiereste pe EOF; modalitate de derulare la
nceput a fiierului ?
8/8/2019 Programarea Calculatoarelor M8
11/12
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 60/66
Manipularea fiierelor n C (continuare)
FILE *fisier;charc, linie[256]; int pos=0;...// codul anterior de citire pas cu pasrewind(fisier);fscanf(fisier,%d,&pos);printf(Numarul este %d,pos);fclose(fisier);
> Funcia rewind permite poziionarea n fiierul curent la
nceputul acestuia.
void rewind(FILE *fisier); fisiereste pointerul la fiier
c:\> 124Sa se citeasca acest si asa mai departe.Numarul este 124
> Exemplul 4: se citeasc valorile unei matrice ptraticede numere ntregi dintr-un fiier de date. Pe prima linie estestocat numrul de elemente.
FILE *fisier;int dim, matrice[100][100], i, j;
fisier= fopen(c:\\test.txt,r);fscanf(fisier,%d, &dim);
for(i=0;i
8/8/2019 Programarea Calculatoarelor M8
12/12
67Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 66/66
Sfritul Cursului 8