Programarea Calculatoarelor (limbajul C) Curs 8 Lucrul cu pointeri şi fişiere de date. Cuprins Lucrul cu pointeri

Documente similare
Limbaje de Programare Curs 8 – Fisiere

Limbaje de Programare Curs 6 – Functii de intrare-iesire

SUBPROGRAME

Microsoft Word - CarteC.doc

Limbaje de Programare Curs 5 – Siruri de caractere

E_d_Informatica_sp_SN_2014_bar_10_LRO

Limbaje de programare Pointeri. Alocare dinamică (continuare) 26 noiembrie 2012

Microsoft Word - PCLP2_Curs_4_2019.doc

Microsoft Word - O problema cu bits.doc

E_d_Informatica_sp_MI_2015_bar_02_LRO

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

PCLPII-C16(9)

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode]

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de

Diapositive 1

L7

Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere S

Slide 1

Microsoft Word - CarteC.doc

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

Laborator 3

Programarea şi utilizarea calculatoarelor

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

Subiectul 1

Paradigme de programare

LUCRAREA NR

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Slide 1

Programarea şi utilizarea calculatoarelor

Lab6LCD

Microsoft Word - CarteC.doc

1. Operatii cu matrici 1 Cerinte: Sa se realizeze functii pentru operatii cu matrici patratice (de dimensiune maxima 10x10). Operatiile cerute sunt: A

Top

Lecții de pregă,re la informa,că Admitere 2019 Tema: Discutarea problemelor date la ul,mele sesiuni de admitere Bogdan Alexe

Slide 1

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

Preprocesorul C Funcţii cu numǎr variabil de argumente 6 decembrie 2005 Programarea calculatoarelor 2. Curs 10 Marius Minea

Slide 1

Fişiere 11 ianuarie 2004 Utilizarea şi programarea calculatoarelor. Curs 13 Marius Minea

Laborator 2 - Încapsularea Programare Orientată pe Obiecte Tema 2.1 Să se analizeze programul EX2.C Indicatii 2.1 A nu se uita de fisierul EX2.H Tema

Declararea variabilelor

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

Microsoft Word - c6.doc

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011

Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut s

Microsoft Word - 4-Interfete paralele.doc

Scrieţi pe foaia de examen răspunsul pentru fiecare dintre cerinţele următoare

Object Oriented Programming

Windows 7

Microsoft Word - Raspunsul la niste provocari. Partea III..doc

C++ Probleme

Microsoft PowerPoint - Curs_SDA_4_RO_2019_v2.pptx

Microsoft PowerPoint - Curs_SDA_3_RO_2019_v2.pptx

PHP (II)

Programarea calculatoarelor. Note de curs Marius Minea 1 Introducere în programarea în C 1.1 Funcţii în limbajul C Calcule şi funcţii La origine, rolu

Microsoft PowerPoint - Curs_SDA_10_RO_2019_v1.pptx

tehnologii web

Paradigme de Programare

Probleme proiect TP BITPERM Implementați un algoritm care citește de la intrarea standard două numere naturale și scrie la ieșirea standard da

Microsoft PowerPoint - Curs_TPI_22_v01.ppt

Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (ve

Microsoft Word _POO_Lab_1_Modificari_v01.htm

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

REVISAL Versiunea: Data release: 15 martie 2016 IMPORTANT! Distribuţia curentă (v6.0.4) a aplicaţiei Revisal conţine nomenclatorul COR ISCO 08 î

Microsoft Word - 2 ES RO.doc

Secţiunea 5-6 avansaţi PROBLEMA 1 Concurs online de informatică Categoria PROGRAMARE 100 puncte NR Un număr natural nenul V care se plictisea singur,

Microsoft Word - BD4_Curs11.doc

Secţiunea 7-8 începători Concurs online de informatică Categoria PROGRAMARE PROBLEMA 1 ID 100 puncte Calculatoarele trebuie să se recunoască în rețeau

Declaraţii. Instrucţiuni 19 octombrie 2005 Programarea calculatoarelor 2. Curs 3b Marius Minea

MINISTERUL EDUCAŢIEI, CULTURII ŞI CERCETĂRII AL REPUBLICII MOLDOVA UNIVERSITATEA DE STAT ALECU RUSSO DIN BĂLŢI FACULTATEA DE ŞTIINŢE REALE, ECONOMICE

Gestionarea I/E

Tipuri de date abstracte 30 noiembrie 2005 Programarea calculatoarelor 2. Curs 9 Marius Minea

Capitole Speciale de Informatică Curs 1: Extragerea informaţiilor. Modelul boolean şi modelul boolean extins 27 septembrie 2018 Extragerea informaţiil

1 Lucrarea nr. 8 - Structuri de date de tip liste sortate O listă sortată reprezintă un aranjament al înregistrărilor din cadrul listei în funcţie de

-

S.C. SEEKTRON S.R.L. Fişă de prezentare a produsului EYECAR B1 EYECAR B1 Observer Black Box Dispozitiv inteligent pentru înregistrarea evenimentelor r

Propunator: Morar Florin Colegiul National Silvania Zalau Discipina: Informatica Nivel liceal, cls. XII 1.Să se scrie în limbajul C/C++ definiţia comp

Tablouri unidimensionale Problema 1 Să se determine mulţimea cifrelor unui număr natural n > 0, dat. Exemplu: n= Cifre = {1,2,3,7} Se cere să s

ALGORITHMICS

Backtracking_2018

Analiză de flux de date 29 octombrie 2012

Anexa nr. 2 FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ superior UNIVERSITATEA DE VEST TIMISOARA 1.2 Facultatea FIZICA 1.3 De

Platforma 5. 1 Introducere in MSSQL Introducere Pe parcursul ultimilor ani, se poate observa o cuplare a limbajelor de programare majore cu tipuri de

Nr. 932 din Avizat ISJ Vâlcea, Inspector școlar informatică, Ciochină Luisa EXAMEN DE ATESTARE A COMPETENȚELOR PROFESIONALE A ABSOLVENȚILOR

Microsoft Word - Algoritmi genetici.docx

Programarea şi utilizarea calculatoarelor

proiectarea bazelor de date

Laborator Implementarea algoritmului DES - Data Encryption Standard. Exemplu DES Algoritmul DES foloseşte numere b

LABORATOR 2

Microsoft Word - Curs1.docx

Înregistrator de temperatură şi umiditate AX-DT100 Instrucţiuni de utilizare

GHERCĂ MAGDA CASA CORPULUI DIDACTIC BRĂILA PORTOFOLIU EVALUARE INFORMATICĂ ȘI TIC PENTRU GIMNAZIU CLASA A V-A Neamț SERIA 1 GRUPA 1 CURSANT: GHERCĂ G

1. Găsiți k numerele cele mai apropiate într-un şir nesortat Dându-se un şir nesortat și două numere x și k, găsiți k cele mai apropiate valori de x.

CABINET MINISTRU

PowerPoint-Präsentation

Lecţia 2 Structura liniară, alternativă şi repetitivă Clasa a V-a Structuri de bază(liniară, alternativă şi repetitivă) Programarea structurată este o

Lucrarea 10

METODE NUMERICE ÎN INGINERIE

Transcriere:

Universitatea Politehnica din Bucureşti Facultatea de Electronică, Telecomunicaţii şi Tehnologia Informaţiei Programarea Calculatoarelor (limbajul C) Curs 8 Lucrul cu pointeri şi fişiere de date Prof. Bogdan IONESCU Ce reprezintă un pointer? > Pentru a înţelege noţiunea de pointer vom relua în discuţie noţiunea de variabilă. > Variabilă = un container sau o zonă de memorie în care sunt stocate anumite valori. VarA nume 2009 2567843 valoarea variabilei adresa de memorie > Zona de memorie nu este oarecare, ci aceasta are o anumită adresă unică (un număr) pe baza căreia se poate face referinţă la ea. > Variabila este identificată printr-un nume alfanumeric unic. 4 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 3/66 Cuprins 8.1. Lucrul cu pointeri 8.2. Lucrul cu fişiere de date Ce reprezintă un pointer? (continuare) VarA nume 2009 2567843 Ce se întămplă dacă scriem: printf( %d, VarA); >2009 valoarea variabilei adresa de memorie VarA indică valoarea Dar dacă scriem: printf( %d, &VarA); >2567843 &VarA indică adresa 2 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 1/66 5 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 4/66 Ce reprezintă un pointer? (continuare) 8.1. Lucrul cu pointeri 3 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 2/66 > Un pointer este tot o variabilă, adică o locaţie de memorie. > Acesta diferă de variabilele clasice prin faptul că, în loc să stocheze valori, acesta stochează doar adrese ale locaţiilor din memorie. > De aici şi denumirea de pointer indicator, prin intermediul adresei pe care o stochează, putem spune că acesta indică spre conţinutul unei alte locaţii de memorie. PointerA 2009 2567843 PointerA valoarea pointerului 2567843 10000 adresa variabilei pointer 6 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 5/66

Lucrul cu pointeri > Pointerii constituie fundamentul limbajului C, aceştia oferind o multitudine de avantaje: - rapiditate în manipularea datelor, eemplu: vrem să copiem valorile vectorului A în vectorul B, folosind pointerii este suficient să stocăm adresa primului element din A în adresa primului element din B, - eficientizare a memoriei, variabilele definite ca pointeri pot fi alocate dinamic: se alocă când vrem, cât vrem şi cât timp vrem (se poate elibera memoria), - anumite calcule nu pot fi eprimate decât pe baza pointerilor, 7 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 6/66 > Eemple: int *PointerInt; double *PointerReal; PointerInt va conţine adresa unei locaţii de memorie ce stochează întregi (32 biţi), PointerReal va conţine adresa unei locaţii de memorie ce stochează double (64 biţi), > Atenţie: tipul datelor indicate este specificat tocmai pentru că acestea sunt stocate diferit, astfel nu putem suprapune un double peste int. > Care sunt ustensilele de care dispunem în lupta cu pointerii: - operatorul unar & = adresa unei variabile, - operatorul de indirectare * = conţinutul obiectului indicat de pointer (conţinutul de la adresa stocată de pointer). 10 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 9/66 > Avantaje (continuare): - o funcţie poate returna mai multe valori cu ajutorul pointerilor, returnând astfel adresa la care se găsesc acestea (de eemplu, adresa de început a unui vector) - transmiterea valorilor prin adresă (pointer) în funcţii permite modificarea valorilor acestora, ceea ce nu este valabil când parametrul funcţiei este transmis prin valoare (cazul clasic), - etc. > Principalul dezavantaj este dat manipularea acestora, ce necesită anumite precauţii, anumite greşeli de manipulare nefiind sesizate de compilator!!! 8 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 7/66 > Eemplu utilizare pointeri: y ip int =1, y=2; int *ip; 1 2?*!# adr.100 adr.200 adr.1000 > Efect: - la adresa variabilei (e.100) am pus valoarea 1, - la adresa lui y (e. 200) am pus valoarea 2, - la adresa pointerului ip (e. 1000) am pus valoarea??? > Când un pointer este declarat, nu conţine o adresă validă, de regulă indică către o zonă de memorie care, de cele mai multe ori nici nu aparţine programului. > După declarare, precum variabilele, pointerul trebuie iniţializat. 11 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 10/66 > În limbajul C studiat până în acest punct, aţi lucrat deja cu pointeri, şi anume la: - lucrul cu vectori şi matrice, - lucrul cu şiruri de caractere, - lucrul cu structuri de date şi uniuni, - lucrul cu funcţii. > Modul de definire al unui pointer: <tip de bază> *<nume pointer>; > Efect: variabila <nume pointer> va fi un pointer ce indică o locaţie de memorie ce stochează valori de tip <tip de bază>. 9 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 8/66 > Eemplu utilizare pointeri (continuare): y ip??? ip=&; 1 2 100 adr.100 adr.200 adr.1000 > Traducere: la adresa de memorie a variabilei pointer ip se va stoca adresa (dată de operatorul &) variabilei. pointerul ip indică acum către variabila. y ip??? y=*ip; 1 1 100 adr.100 adr.200 adr.1000 > Traducere: variabila y preia valoarea de la adresa stocată în pointerul ip sau cu alte cuvinte, conţinutul obiectului indicat de ip (returnat de operatorul *). 12 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 11/66

> Eemplu utilizare pointeri (continuare): y ip??? =ip; 100 2 100 adr.100 adr.200 adr.1000 > Traducere: variabila va lua valoarea variabilei pointer ip, şi anume adresa conţinută de aceasta, care este adresa lui. y ip??? *ip=3; 3 2 100 adr.100 adr.200 adr.1000 > Traducere: conţinutul obiectului indicat de pointerul ip, şi anume locaţia de memorie de la adresa 100 va primi valoarea 3. variabila are valoarea 3 (echivalent =3). 13 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 12/66 > Eemplu 1*: char *mychar; short *myshort; long *mylong; mychar=1000; myshort=2000; mylong=3000; mychar++; myshort++; mylong++; *http://www.cplusplus.com /doc/tutorial/pointers.html - mychar indică o locaţie de memorie pe 8 biţi (1 byte), - myshort indică o locaţie de memorie pe 16 biţi (2 bytes), - mylong indică o locaţie de memorie pe 32 biţi (4 bytes), 16 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 15/66 > Recapitulare: ip înseamnă: conţinutul variabilei pointer ip şi anume o adresă la o variabilă de tip întreg. > Eemplu 2: int *p, ; p=&; *p++=10; - p este un pointer care indică variabila întreagă. int *ip; &ip înseamnă: adresa din memorie a variabilei pointer ip şi anume locaţia unde stochează adresele *ip înseamnă: conţinutul obiectului indicat de pointer şi anume conţinutul locaţiei de memorie de la adresa memorată de pointer (adr. ip) > Atenţie: operatorii ++ şi -- au prioritate mai mare decât operatorul * (vezi Cursul 5). > Astfel, *p++ este echivalent cu *(p++). p 8 biţi adr.a 8 biţi adr.a+1 8 biţi 8 biţi adr.a+2 adr.a+3 p++ 8 biţi adr.a+4 14 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 13/66 17 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 16/66 Aritmetica pointerilor > Fiind variabile, pointerii permit efectuarea a o serie de operaţii specifice variabilelor. Care este efectul acestor instrucţiuni? ip int *ip; *ip=100;?*!# 100 adr. adr.?*!# > Greşeală tipică: un pointer trebuie iniţializat, deoarece altfel este posibil să indice o locaţie inaccesibilă. Corect ar fi: int *ip, ; ip=&; *ip=100; ip adr.a adr.b 100 adr.b 15 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 14/66 > Eemplu 2 (continuare) p 8 biţi adr.a 8 biţi adr.a+1 8 biţi 8 biţi adr.a+2 > Teoretic, *(p++)=10 se traduce prin: adr.a+3 p++ 18 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 17/66 10 adr.a+4 - p nu mai are ca valoare adresa lui (adr. A) ci p++, şi anume adresa p+4bytes (adr.a+4). - la adresa stocată la adr.a+4 se va pune valoarea 10. > Practic am 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.

> Eemplu 3: int *p, =15; p=&; (*p)++; p p p adr.a adr.a adr.a??? 15 adr.b adr.b 15 adr.b adr.b 15+1 adr.b > (*p)++ conţinutul locaţiei de memorie indicate de p este mărit cu 1, echivalent cu ++. 19 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 18/66 > Eemplu 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<5; n++) printf( %d,, numere[n]); p va primi ca valoare adresa primului element din vectorul numere, 1000, la care se adaugă 3 unităţi de memorie, în acest caz 3*32 de biţi. p=1012 numere 10 20 30 40 32biţi 1000 1004 1008 1012 1016 p=1000, operaţia + este prioritară faţă numere de *, astfel p=1016 10 20 30 40 50 1000 1004 1008 1012 1016 22 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 21/66 > Eemplu 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<5; n++) printf( %d,, numere[n]); numere 32biţi 32biţi 32biţi 32biţi 32biţi 1000 1004 1008 1012 1016 p=1000 (p indică primul element al vectorului) numere 10 32biţi 32biţi 32biţi 32biţi 1000 1004 1008 1012 1016 p=1000+4 (adresa indicată de p este incrementată cu o unitate, în acest caz un int de 32 de biţi) 20 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 19/66 Pointeri şi funcţii > În general, în limbajul C, parametrii unei funcţii sunt transmişi prin valoare. funcţia apelată primeşte o copie a variabilei, adică valoarea variabilei copiată la o altă adresă de memorie decât cea a variabilei originale > Eemplu: variabilele a şi b sunt transmise prin valorile acestora, deci nu void schimba(int a, int b); vor fi modificate de funcţie. > O altă modalitate de transmitere a parametrilor este prin referinţă sau adresă. funcţia apelată primeşte o copie a adresei variabilei ce conţine parametrul efectiv (un pointer). 23 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 22/66 > Eemplu 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<5; n++) printf( %d,, numere[n]); numere 10 20 32biţi 32biţi 32biţi 1000 1004 1008 1012 1016 p=1004 (incrementat anterior) p=adresa elementului de indice 2 din vector,??? 1008. p indică acum spre variabila numere[2]. numere 10 20 30 32biţi 32biţi 1000 1004 1008 1012 1016 21 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 20/66 Pointeri şi funcţii (continuare) > Eemplu: void schimba(int *pa, int *pb); > Detaliu funcţie: void schimba(int *pa, int *pb) int tmp; tmp=*pa; *pa=*pb; *pb=tmp; funcţia primeşte două valori de adrese ce corespund locaţiilor la care se află variabilele ce vrem să le modificăm. funcţia interschimbă valorile a două variabile de tip intreg. tmp preia conţinutul locaţiei de memorie indicată de pa (*pa), conţinutul lui pa (*pa) preia conţinutul lui pb (*pb), conţinutul lui pb (*pb) ia valoarea tmp. 24 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 23/66

Pointeri şi funcţii (continuare) > Cum apelăm funcţia din programul principal? int main() int a=3, b=6; schimba( &a, &b); void schimba(int *pa, int *pb) int tmp; tmp=*pa; *pa=*pb; *pb=tmp; > Să vedem ce se întâmplă în memorie? 8.2. Lucrul cu fişiere de date 1. a b 3 6 adr.a adr.b pa adr.a adr.pa pb adr.b adr.pb 25 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 24/66 28 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 27/66 2. 3. Pointeri şi funcţii (continuare) int main() int a=3, b=6; schimba( &a, &b); a a adr.a adr.a b b adr.b adr.b pa pa adr.pa adr.pa void schimba(int *pa, int *pb) int tmp; tmp=*pa; *pa=*pb; *pb=tmp; pb pb adr.pb adr.pb tmp 3 6 adr.a adr.b??? tmp adr.tmp 3 6 adr.a adr.b 3 adr.tmp 26 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 25/66 Fişiere de date > Datele folosite la un moment dat, în timpul eecuţiei unui program sunt stocate temporar în memoria internă (e. RAM); > Datele ce sunt păstrate pe termen lung sunt stocate permanent în memoria eternă (e. HDD); preluate în memoria RAM când sunt folosite; informaţie brută 0001010010 1100011010 1111110001 0011110110 0001111111 program: Windows 7 Eplorer 29 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 28/66 4. 5. Pointeri şi funcţii (continuare) int main() int a=3, b=6; schimba( &a, &b); a a adr.a adr.a b b adr.b adr.b pa pa adr.pa adr.pa void schimba(int *pa, int *pb) int tmp; tmp=*pa; *pa=*pb; *pb=tmp; pb pb adr.pb adr.pb tmp 6 6 adr.a adr.b 3 tmp adr.tmp 6 3 adr.a adr.b 3 adr.tmp 27 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 26/66 Fişiere de date (continuare) Pentru a putea accesa informaţia de pe dispozitivele eterne de stocare aceasta trebuie indeată sau organizată; A. unităţile fizice sunt împărţite (opţional) la nivel logic (nu fizic) în partiţii ce sunt desemnate prin litere, e. C:, D:, F: etc. computer management Windows XP Disc-0 Disc-1 Disc-2 C: 29.29GB D: 119.75GB G: 960MB H: 1.95GB Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 29/66

Fişiere de date (continuare) Pentru a putea accesa informaţia de pe dispozitivele eterne de stocare aceasta trebuie indeată sau organizată; B. informaţia stocată pe fiecare unitate logică (partiţie) este organizată ierarhic (arborescent): C: 29.29GB nivelul rădăcină ROOT.ee.com.bat fişiere = colecţii de date stocate unitar şi identificate prin: <nume_fisier>.<etensie> identificator alfanumeric ~3 litere ce descriu tipul conţinutului;.tt.doc.pdf.bmp.cpp.mpg Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 30/66 Fişiere de date (continuare) > Cum facem referire la un anumit fişier dintr-un anumit director, de eemplu fişierul eplorer.ee? definim calea către acesta (path): Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 33/66 E:\ E:\windows\eplorer.ee windows\ eplorer.ee > \ marchează conţ. directorului curent; Fişiere de date (continuare) Pentru a putea accesa informaţia de pe dispozitivele eterne de stocare aceasta trebuie indeată sau organizată; B. informaţia stocată pe fiecare unitate logică (partiţie) este organizată ierarhic (arborescent): C: 29.29GB nivelul rădăcină ROOT window s directoare = colecţii de fişiere şi/sau directoare (sunt identificate prin nume) mydoc myimg myvideo nivelul 1 nivelul 2 nivelul 3 nivelul N Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 31/66 Manipularea fişierelor în C > Citirea - scrierea datelor în fişiere reprezintă de fapt operaţii de intrare (datele sunt preluate din fişier = input) ieşire (datele sunt stocate pe HDD = output); > Uneori este avantajos să preluăm datele direct dintr-un fişier, astfel nefiind necesară intervenţia utilizatorului: volum mare de date de intrare; datele de intrare sunt aceleaşi la fiecare rulare (e. teste); datele de intrare sunt furnizate de un alt program independent de utilizator > Similar, datele de ieşire ale programului pot fi stocate: rămân disponibile după încheierea programului; pot fi folosite ca date de intrare pentru alt program Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 34/66 Fişiere de date (continuare) > Eemplu: partiţii (C:, D:, E: ) directoare, e. WINDOWS sub-directoare, e. system fişiere, e. eplorer.ee > Limbajul de programare C pune la dispoziţia programatorului următoarele operaţii de lucru cu fişiere de date: - crearea şi denumirea fişierelor; - deschiderea unui fişier pentru manipulare date; - citirea conţinutului unui fişier (secvenţial, aleator); - scrierea datelor într-un fişier (creare fişier nou sau adăugare de date la un fişier eistent); - închiderea fişierului; > funcţiile se găsesc în biblioteca stdio.h Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 32/66 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 35/66

> Un fişier este referenţiat printr-o variabilă pointer: FILE *fisier1; FILE *fisier2; fisier1 este un pointer la o structură de tip fişier de date, fisier2 este un alt pointer la o structură de tip fişier de date. > Ca şi în cazul pointerilor, fişierele trebuie iniţializate şi anume le trebuie asociat un fişier fizic de pe dispozitivul de stocare: FILE *fopen(const char *nume_fisier, const char *mod); returnează un pointer la fişier. se specifică numele fişierului şi calea acestuia. se specifică modul de deschidere al fişierului > Observaţie: modurile de deschidere enunţate anterior se referă la fişiere de tip tet (conţinut alfanumeric), pentru fişiere binare se adaugă caracterul b ; - fisier este un pointer la un > Eemplul 1: obiect de tip FILE, fisier=fopen( c:\\test.tt, w ); De ce apare \\? backslash este un caracter special, comanda \ + \ = \! if (fisier==null) printf( Fisierul nu a putut fi creat ); - se crează fişierul test.tt la locaţia specificată, şi anume pe partiţia c: (director rădăcină) şi se returnează controlul pentru scriere la pointerul fisier. dacă pointerul este nul (nu indică nimic) problemă la deschidere! Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 36/66 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 39/66 FILE *fopen(const char *nume_fisier, const char *mod); modul de deschidere al fişierului: - r (read only) permite deschiderea unui fişier doar pentru a fi citit conţinutul acestuia, - w (write) crează un fişier gol în care se pot scrie date. Dacă fişierul cu acest nume eistă deja, conţinutul acestuia este şters! - a (append) deschide fişierul menţionat pentru a adăuga date în continuarea celor eistente. Dacă fişierul nu eistă acesta este creat. > Eemplul 2: fisier=fopen( c:\\demo\\tmp\\test.tt, w ); unde este creat fişierul? > Eemplul 3: fisier=fopen( test.tt, w ); dar acum? c:\demo\tmp\test.tt în directorul curent Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 37/66 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 40/66 FILE *fopen(const char *nume_fisier, const char *mod); modul de deschidere al fişierului (continuare): - r+ deschide un fişier pentru actualizarea datelor, permiţând atât scriere cât şi citire, - w+ crează un fişier nou în care se vor putea scrie cât şi citi date. Dacă eistă un fişier cu acelaşi nume atunci conţinutul acestuia este şters. - a+ deschide un fişier pentru adăugare de date cât şi pentru citire. Toate operaţiile de scriere vor fi efectuate eclusiv în continuarea datelor eistente (protejare conţinut iniţial). Dacă fişierul nu eistă atunci va fi creat. > După folosire un fişier trebuie închis (eliberare flu de date): int *fclose(file *fisier); > Eemplu complet: fisier=fopen( c:\\proba\\test.tt, w ); if (fisier==null) printf( Fisierul nu a putut fi creat ); else - închide fluul de date deservit de pointerul fişier, - dacă operaţia este reuşită se returnează codul 0. Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 38/66 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 41/66

> Scrierea datelor în fişier: int fprintf(file *fisier, const char *format, a, b, 15, ); fisier este pointerul ce referenţiază conţinutul fişierului format (şir de caractere) specifică modul de afişare (formatare) cât şi tipul datelor afişate după, se specifică variabilele sau constantele anunţate în format. > Funcţia fprintf funcţionează identic ca funcţia printf doar că datele nu sunt afişate pe ecran, ci salvate într-un fişier tet; > Fişierul tet poate fi văzut ca o imagine a datelor de pe ecran (acestea sunt salvate identic, păstrând modul de formatare); Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 42/66 > Eemplul 3: FILE *fpar, *fimpar; int vect[100], dim, i; printf( Dim= ); scanf( %d,&dim); for (i=0; i<dim; i++) printf( V[%d]=,i); scanf( %d,&vect[i]); fpar=fopen( c:\\pare.tt, w ); fimpar=fopen( c:\\impare.tt, w ); for (i=0; i<dim; i++) if ((vect[i] % 2)==0) fprintf(fpar, %d\n, vect[i]); else fprintf(fimpar, %d\n, vect[i]); fclose(fpar); fclose(fimpar); c:\> Dim=5 (enter) V[0]=1 (enter) V[1]=4 (enter) V[2]=7 (enter) V[3]=6 (enter) V[4]=9 (enter) Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 45/66 > Eemplul 1: c:\> Nume=Vlad (enter) Prenume=Ionescu (enter) int v=20; float i=1.8; char nume[20], prenume[20]; printf( Nume= ); scanf( %s,nume); printf( Prenume= ); scanf( %s,prenume); fisier=fopen( c:\\test.tt, 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# ); Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 43/66 > Eemplul 3: continuare FILE *fpar, *fimpar; int vect[100], dim, i; // citire vector // scriere vector in fisier fpar=fopen( c:\\par.tt, a ); fimpar=fopen( c:\\impar.tt, a ); fprintf(fpar, -sfarsit- ); fprintf(fimpar, -sfarsit- ); fclose(fpar); fclose(fimpar); - am deschis fişierele de date în modul de adăugare de informaţii (append)??? - fişierele par.tt şi impar.tt nu eistă vor fi create. Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 46/66 > Eemplul 2: c:\> Dim=3 (enter) M[0][0]=1 (enter) M[0][1]=5 (enter) int matrice[20][20], dim, i, j; M[0][2]=7 (enter) M[1][0]=3 (enter) printf( Dim= ); scanf( %d,&dim); M[1][1]=9 (enter) CitireMatrice(matrice, dim); // functie definita anterior fisier=fopen( c:\\test.tt, w ); fprintf(fisier, %d\n, dim); for (i=0; i<dim; i++) for (j=0; j<dim; j++) fprintf(fisier, %d\t,matrice[i][j]); fprintf(fisier, \n ); M[1][2]=11 (enter) M[2][0]=4 (enter) M[2][1]=1 (enter) M[2][2]=0 (enter) > Eemplul 3: corect FILE *fpar, *fimpar; int vect[100], dim, i; // citire vector // scriere vector in fisier fpar=fopen( c:\\pare.tt, a ); fimpar=fopen( c:\\impare.tt, a ); fprintf(fpar, -sfarsit- ); fprintf(fimpar, -sfarsit- ); fclose(fpar); fclose(fimpar); - fiind în modul de adăugare, tetul va fi scris în continuarea datelor eistente deja în fişier. Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 44/66 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 47/66

> Scrierea datelor în fişiere: P Enunţ: Să se definească o structură de date ce permite stocarea următoarelor informaţii relative la o persoană: nume, prenume, vârstă, adresă, telefon, email. Să se realizeze o funcţie ce permite citirea acestor date pentru elevii unei clase de liceu. Să se eporte datele obţinute într-un fişier denumit astfel: DateEleviClasa_<numec>.tt, unde <numec> va fi specificat de utilizator. Variabile de intrare/lucru: struct elev; struct elev clasa[40]; int NrElevi, i; char numec[10]; Variabile de ieşire: Funcţii: CitireDateClasa; EportDateFisier; > Funcţia CitireDateClasa: void CitireDateClasa(struct elev clasa[40], int NrElevi) int i; for (i=0; i<nrelevi; i++) printf("elevul #%d\n",i); printf("nume="); scanf("%s", clasa[i].nume); printf("prenume="); scanf("%s", clasa[i].prenume); printf("varsta="); scanf("%d", &clasa[i].varsta); printf("adresa="); scanf("%s", clasa[i].adresa); printf("telefon="); scanf("%s", clasa[i].telefon); printf("email="); scanf("%s", clasa[i].email); Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 48/66 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 51/66 > Programul principal: #include <stdio.h> #include <stdlib.h> #include <strings.h> // biblioteca de lucru cu siruri de caractere struct elev char nume[100], prenume[100], adresa[200], telefon[14], email[100]; int varsta; clasa[40]; void CitireDateClasa(struct elev clasa[40], int NrElevi); void EportDateFisier(FILE *fisier, char numefisier[20], struct elev clasa[40], char numec[10], int NrElevi); int main() int i, NrElevi; char numec[10], numefisier[100]; printf("date de intrare\nnumar elevi="); scanf("%d",&nrelevi); printf("numele clasei="); scanf("%s",numec); continuare Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 49/66 > Funcţia EportDateFisier: void EportDateFisier(FILE *fisier, char numefisier[20], struct elev clasa[40], char numec[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<nrelevi; i++) fprintf(fisier,"\nelevul %s %s\n", clasa[i].nume, clasa[i].prenume); fprintf(fisier,"varsta: %d ani\n", clasa[i].varsta); fprintf(fisier,"adresa: %s\n", clasa[i].adresa); fprintf(fisier,"telefon: %s\n", clasa[i].telefon); fprintf(fisier,"email: %s\n", clasa[i].email); Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 52/66 > Programul principal (continuare): continuare int main() // citire date elevi CitireDateClasa(clasa, NrElevi); // generare nume fisier care sa contina numele clasei // c:\ + DateEleviClasa_ +<numec>+.tt strcpy(numefisier,"c:\\dateeleviclasa_"); strcat(numefisier,numec); strcat(numefisier,".tt"); - copiază şirul de caractere din dreapta în variabila şir de caractere din stânga (numefisier); - concatenează două şiruri de caractere şi le stochează în variabila din stânga (numefisier); // eportare date clasa in fisierul denumit numefisier EportDateFisier(fisier, numefisier, clasa, numec, NrElevi); Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 50/66 > Citirea datelor dintr-un fişier: int fscanf(file *fisier, const char *format, &a, &b, ); fisier este pointerul ce referenţiază conţinutul fişierului format (şir de caractere) specifică tipul datelor ce vor fi citite din fişier. după, se specifică unde vor fi stocate datele citite (adrese de memorie). > Funcţia fscanf funcţionează identic ca funcţia scanf doar că dispozitivul de intrare nu este tastatura ci fişierul de date; > Funcţia fscanf returnează fie numărul de obiecte citite corect (variabile) sau în cazul în care datele nu pot fi citite returnează EOF (= sfârşit de fişier). Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 53/66

> Eemplul 1: avem la dispoziţie fişierul char linie[256]; int stop; fisier= fopen( c:\\test.tt, r ); do stop=fscanf(fisier, %s,linie); if (stop!=eof) printf( am citit:%s\n,linie); while (stop!=eof); - se deschide fişierul de date dorit în modul de citire (read); -c:\>am se citeşte citit:#datepersonale# progresiv câte un şir de am caractere citit:nume=vlad până când funcţia am citit:prenume=ionescu fscanf returnează EOF (ajunge la capătul fişierului). am citit:varsta=20 - pe măsură ce se citesc date, poziţia am curentă citit:inaltime=1.80 în fişier se modifică; am citit:#sfarsit# Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 54/66 EOF > Eemplul 3: vom citi progresiv caractere de la inceputul fişierului până când întâlnim EOF: - linie stochează la un moment dat o linie din fişier; char c, linie[256]; int pos=0; - pos va memora poziţia fisier=fopen( c:\\test.tt, r ); curentă în linie; 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); - citim din fişier un caracter c cât timp nu am ajuns la capătul fişierului; - dacă c nu este sfârşit de linie şi nici de fişier atunci il adăugăm la line pe pos; - dacă c este sfârşit de linie sau de fişier atunci înseamnă că am obţinut o linie completă afişăm pe ecan; Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 57/66 > Eemplul 2: avem la dispoziţie fişierul char linie[256]; int stop; fisier= fopen( c:\\test.tt, r ); do stop=fscanf(fisier, %s,linie); if (stop!=eof) printf( am citit:%s\n,linie); while (stop!=eof); - cum este citit tetul în acest caz? (indicaţie: analogie citire şiruri de caractere cu scanf) c:\>am citit:#date am citit:personale# am citit:nume=vlad am citit:prenume=ionescu am citit:varsta=20 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 55/66 EOF > Cum se eecută: char c, linie[256]; int pos=0; fisier=fopen( c:\\test.tt, 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); iteraţia 1: c= 1, linie= 1 iteraţia 2: c= 2, linie= 12 iteraţia 3: c= 4, linie= 124 iteraţia 4: c= \n, linie= 124\0 iteraţia 5: c= S, linie= S iteraţia 6: c= a, linie= Sa iteraţia 7: c=, linie= Sa iteraţia 8: c= s, linie= Sa s Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 58/66 > Pentru a citi fişierul ca un şir de caractere avem nevoie de un control mai fin a ceea ce citim: int fgetc(file *fisier); fisier este pointerul ce referenţiază conţinutul fişierului > Funcţia fgetc returnează caracterul din poziţia curentă la care se citeşte din fişier, iar după aceasta avansează automat cu un caracter (efect similar funcţiei getc). > Avem la dispoziţie fişierul tet următor: > tetul de fapt arată aşa: 124\nSa se citeasca acest tet linie cu linie.\naceasta este linia 2 urmata\nde linia 3 si asa mai departe.eof > După citirea linie cu linie vrem să citim numărul de la începutul fişierului, astfel: char c, linie[256]; int pos=0; fisier=fopen( c:\\test.tt, 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); - în urma citirii pas cu pas în acest punct poziţionarea în fişier este pe EOF; modalitate de derulare la început a fişierului? Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 56/66 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 59/66

void rewind(file *fisier); > Funcţia rewind permite poziţionarea în fişierul curent la începutul acestuia. char c, linie[256]; int pos=0; // codul anterior de citire pas cu pas rewind(fisier); fscanf(fisier, %d,&pos); printf( Numarul este %d,pos); fisier este pointerul la fişier c:\> 124 Sa se citeasca acest si asa mai departe. Numarul este 124 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 60/66 > Funcţia CitireDateDinFisier: void CitireDateDinFisier(FILE *fisier, char numef[100], float matrice[100][100], int *NrL, int *NrC) // functia va returna valorile matricei cat si dimensiunile acesteia prin lucrul // cu pointeri (variabilele sunt transmise prin adrese) int i, j, NrL_, NrC_; fisier=fopen(numef, r ); if (fisier==null) printf( Fisierul nu a putut fi deschis! ); return; else fscanf(fisier, %d%d, &NrL_, &NrC_); for (i=0;i<nrl_;i++) for (j=0;j<nrc_;j++) fscanf(fisier, %f,&matrice[i][j]); *NrL=NrL_; *NrC=NrC_; printf( Au fost citite cu succes %d elemente\n, NrL_*NrC_); Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 63/66 > Eemplul 4: se citesc valorile unei matrice pătratice de numere întregi dintr-un fişier de date. Pe prima linie este stocat numărul de elemente. int dim, matrice[100][100], i, j; fisier= fopen( c:\\test.tt, r ); fscanf(fisier, %d, &dim); for (i=0;i<dim;i++) for (j=0;j<dim;j++) fscanf(fisier, %d, &matrice[i][j]); - se citeşte dimensiunea matricei de pe prima linie; - se parcurg elementele matricei şi se citesc repetitiv din fişier (după fiecare citire poziţia în fişier avansează automat) Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 61/66 EOF > Funcţia CalculMMM: void CalculMMM(float matrice[100][100], int NrL, int NrC, float *ma, float *min, float *medie) // functia preia matrice si calculeaza valorile ma, min si medie care sunt // returnate prin intermediul adresei (variabilele sunt transmise prin adresa) float ma_, min_, medie_; int i, j; ma_=min_=matrice[0][0]; for (i=0; i<nrl; i++) for (j=0; j<nrc; j++) if (matrice[i][j]>ma_) ma_=matrice[i][j]; if (matrice[i][j]<min_) min_=matrice[i][j]; medie_+=matrice[i][j]; if (NrC*NrL==0) medie_=0; else medie_/=nrc*nrl; *ma=ma_; *min=min_; *medie=medie_; Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 64/66 > Citirea/scrierea datelor în fişiere: P Enunţ: Să se citească o matrice de numere reale dintr-un fişier de date de intrare. Se ştie ca pe prima linie sunt stocate numărul de linii şi numărul de coloane ale matricei. Să se calculeze valoarea maimă, valoarea minimă şi media aritmetică a valorilor. Să se adauge aceste valori la sfârşitul fişierului de date. Variabile de intrare/lucru: float matrice[100][100]; int NrL, NrC, i, j; float ma, min, medie; Variabile de ieşire: Funcţii: CitireDateDinFisier; CalculMMM; > Programul principal: #include <stdio.h> #include <stdlib.h> int main () int NrL, NrC, i, j; float matrice[100][100], ma, min, medie; CitireDateDinFisier(fisier, c:\\data.in, matrice, &NrL, &NrC); CalculMMM(matrice, NrL, NrC, &ma, &min, &medie); fisier=fopen( c:\\data.in, a ); fprintf(fisier, Val.ma=%f\n,ma); fprintf(fisier, Val.min=%f\n,min); fprintf(fisier, Val.medie=%f\n,medie); Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 62/66 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 65/66

Sfârşitul Cursului 8 67 Curs Programarea Calculatoarelor, Prof. Bogdan IONESCU 66/66