Limbaje de Programare Curs 8 – Fisiere

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

Limbaje de Programare Curs 6 – Functii de intrare-iesire

Limbaje de Programare Curs 5 – Siruri de caractere

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

Microsoft Word - CarteC.doc

SUBPROGRAME

E_d_Informatica_sp_SN_2014_bar_10_LRO

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

Microsoft Word - CarteC.doc

Microsoft Word - PCLP2_Curs_4_2019.doc

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

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

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

Top

Microsoft PowerPoint - Curs_TPI_22_v01.ppt

Microsoft Word - O problema cu bits.doc

Slide 1

PRELEGERE XIII PROGRAMAREA CALCULATOARELOR ŞI LIMBAJE DE PROGRAMARE Noţiunea de funcţie - continuare VI. Funcţii recursive O funcţie se poate activa n

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 Word - 2 ES RO.doc

PPSD

L7

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

Microsoft Word _POO_Lab_1_Modificari_v01.htm

Lab6LCD

Analiză statică Analiza fluxului de date 23 octombrie 2014

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

E_d_Informatica_sp_MI_2015_bar_02_LRO

Programarea şi utilizarea calculatoarelor

Subiectul 1

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

LUCRAREA NR

Analiză de flux de date 29 octombrie 2012

Paradigme de Programare

Microsoft Word - c6.doc

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

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

Rezolvare model de subiect practic P2 Programarea Calculatoarelor sesiunea iunie 2017

Gestionarea I/E

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

Adresarea memoriei Modurile de adresare constituie un instrument principal pentru reprezentarea în memorie a imaginii datelor, aşa cum este ace

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

7. Alinierea robustă a densităţilor de puncte 3D Măsurarea distanţei dintre diferite forme geometrice 3D Estimarea rotaţiei şi a translaţiei optime în

Microsoft Word - CarteC.doc

Lucrarea nr. 2 Aplicaţii de tip client Mihai IVANOVICI 6 martie 2006 Scopul acestei lucrări este de a vă familiariza cu modulul Python socket şi cu mo

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

Slide 1

PowerPoint-Präsentation

Slide 1

Laborator 3

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

Microsoft PowerPoint - Curs_SDA_3_RO_2019_v2.pptx

Object Oriented Programming

PHP (II)

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Microsoft Word - 4-Interfete paralele.doc

Programarea şi utilizarea calculatoarelor

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic Programare în limbaj de asamblare 42. Utilizare Debug şi TurboDebug

Microsoft PowerPoint - Curs_SDA_4_RO_2019_v2.pptx

Logică și structuri discrete Relații. Funcții parțiale Marius Minea marius/curs/lsd/ 20 octombrie 2014

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

PROGRAMA DE EXAMEN

Programarea şi utilizarea calculatoarelor

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

proiectarea bazelor de date

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

Laborator 1-Teoria probabilitatilor si statistica matematica Sef lucrari dr.mat. Daniel N.Pop Departamentul de calculatoare si inginerie electrica 1 P

Testare manuala: situatia in care o persoana initiaza fiecare test, interactioneaza cu el si interpreteaza, analizeaza si raporteaza rezultatele. Test

PCLPII-C16(9)

Paradigme de programare

Modul Modbus ASCII SISTEME DE COMUNICATIE CURS 5 - Constantinescu Catalin Atunci cand se foloseste modul MODBUS ASCII fiecare octet din mesaj

Microsoft Word - Prezentare - A4 - cernavoda.doc

PowerPoint-Präsentation

Diapositive 1

Baze de date - Anul 2 Laborator 8 Limbajul de definire a datelor (LDD) (partea I) În general, instrucţiunile LDD sunt utilizate pentru definirea struc

C++ Probleme

Declararea variabilelor

Raportarea serviciilor de dializă la nivel CNAS


Gestiunea serviciilor de recuperare a sănătăţii în sanatorii şi preventorii

tehnologii web

ANEXĂ

Laborator 04: Apeluri de funcții

Microsoft Word - Curs_07.doc

Utilizare Internet

Mic ghid de folosire a Gmail

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

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

Aggregating Data

Laborator 8: PROIECTAREA BAZELOR DE DATE SUBPROGRAME in PL/SQL (partea II - functii) Un subprogram este un bloc PL/SQL cu nume (spre deosebire de bloc

O NOUA PROBLEMA DE CONCURS OLIMPIADA MUNICIPALA DE INFORMATICA, IASI 2019 V-am promis într-un articol mai vechi ca vom prezenta pe acest blog câteva p

Logică și structuri discrete Mulțimi Casandra Holotescu

Microsoft Word - unitati de invatare 11liceu-12 sam

Ghidul pentru utilizator

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

Lucrarea nr

Microsoft Word - Laboratorul 3.doc

Microsoft Word - Laborator 6 - Expresii Regulate IV.doc

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

Transcriere:

Limbaje de Programare Curs 8 Fişiere Dr. Casandra Holotescu Universitatea Politehnica Timişoara

Ce discutăm azi... 1 Lucrul cu fişiere 2 Fişiere de tip text 3 Funcţii pentru cazuri de eroare 4 Fişiere binare 5 Poziţionare în fişier

Fişiere Fişier = o colecţie de date, păstrate în mod persistent pe un dispozitiv de stocare (ex. disc). Conţinutul unui fişier este o secvenţă de octeţi. Aceasta poate fi interpretată în diverse moduri: linii de text binar, etc. Din punct de vedere logic, un fişier poate fi privit ca un flux (stream) de octeţi.

Fişiere La nivel de utilizator, ne referim la un fişier prin nume (ex.: tema.doc, program.c, melodie.mp3, text.txt). La nivelul interfeţei de programare, bibliotecile limbajului C definesc un tip FILE cu elementele necesare accesului la fişier: poziţia curentă în fişier tamponul de date indicatori de eroare şi EOF Atenţie: tipul FILE nu poate fi folosit ca atare! Structura internă a tipului FILE este invizibilă programatorului! Putem folosi doar pointeri FILE * prin intermediul funcţiilor de bibliotecă!

Fişiere standard Fişiere (FILE *) standard predefinite (deschise automat la rulare): stdin : fişierul standard de intrare (implicit: tastatura) stdout : fişierul standard de ieşire (implicit: ecranul) stderr : fişierul standard de eroare (implicit: ecranul) Toate cele 3 fluxuri de octeţi standard (de intrare, de ieşire, de eroare) pot fi redirecţionate, de ex. din/către alte fişiere. Obs: E bine ca mesajele de eroare să fie scrise la stderr, pentru a putea fi separate (prin redirectare) de mesajele normale de ieşire.

Fişiere standard: redirecţionare Se poate face la rularea programului, din linia de comandă: redirect. intrării standard (stdin):./program < in.txt (citeşte din in.txt) redirect. ieşirii standard (stdout):./program > out.txt (scrie la out.txt) ambele:./program < in.txt > out.txt Redirecţionarea se poate face şi din program (cu funcţia freopen).

Lucrul cu fişiere Pentru a lucra cu fişiere: 1 se deschide fişierul: i se asociază un stream (o variabilă de tipul de date FILE *) 2 se lucrează cu stream-ul ca şi cum s-ar citi/scrie de la/la intrarea/ieşirea standard (cu aceleaşi funcţii sau cu funcţii asemănătoare din stdio.h) 3 la sfârşitul prelucrării se închide fişierul Atenţie: Orice operaţie cu fişiere poate rezulta în eroare e obligatorie testarea valorii returnate de funcţiile care lucrează cu fişiere!

Deschiderea unui fişier Se face cu funcţia: FILE *fopen (const char *path, const char *mode); care returnează un stream (FILE *) asociat fişierului sau NULL dacă fişierul nu s-a putut deschide / în caz de eroare. Argumentele funcţiei fopen: const char* path: numele/calea fişierului (absolută sau faţa de directorul curent), ca şir de caractere const char *mode: modul de deschidere, tot ca şir de caractere

Deschiderea unui fişier const char *mode: modul de deschidere poate fi r: deschidere la citire, fişierul trebuie să existe pe disc! w: deschidere la scriere, dacă fişierul nu există este creat, dacă există deja conţinutul său este trunchiat a: deschidere la scriere, dacă fişierul există se adaugă conţinut în continuarea celui existent Şirul de caractere mode mai poate conţine, în continuare: +: permite şi celălalt mod (r/w) în plus faţă de cel specificat deja de primul caracter b: fişierul se deschide în mod binar (default: în mod text)

Închiderea unui fişier Se face cu funcţia Aceasta: int fclose(file *stream); scrie orice a rămas în tampoanele de date închide fişierul returnează 0 în caz de succes, EOF în caz de eroare. pentru a ne asigura că fişierul s-a închis cu bine se testează valoarea returnată.

Lucrul cu fişiere: structura tipică char name = f. t x t ; // numele se poate l u a s i d i n argv [ ] // sau poate f i c i t i t FILE f p = fopen ( name, r ) ; i f ( f p = = NULL){ // e r o a r e l a d e s c h i d e r e } e l s e { // succes, putem l u c r a cu f i s i e r u l } i f ( f c l o s e ( f p ) ) { // e r o a r e l a i n c h i d e r e }

Fişiere text Fişierele text sunt fişiere într-un format ce conţine caractere ASCII, uşor de citit de către om. Ex.: prog.c, notitze.txt, pag-web.html La citirea/scrierea datelor în mod text se pot petrece diverse conversii (de exemplu \n din UNIX devine \r \n în DOS). Datele citite corespund celor scrise doar dacă: caracterele sunt tiparibile, \t sau \n \n nu e precedat de spaţii ultimul caracter e \n altfel, deschideţi fişierele în mod binar (asigură corespondenţa exactă între datele scrise şi cele citite).

Fişiere text - funcţii din stdio.h int fputc(int c, FILE *stream); //scrie caracter în fişier int fgetc(file *stream); //citeşte caracter din fişier // getc, putc: ca şi fgetc, fputc, dar sunt macrouri (#define) int ungetc(int c, FILE *stream); // pune caracterul c înapoi int fscanf (FILE *stream, const char *format,...); int fprintf(file *stream, const char *format,...); //citire/scriere formatata, ca scanf, printf, dar din fisierul stream int fputs(const char *s, FILE *stream); // scrie un şir int puts(const char *s); // scrie şirul şi apoi \n la ieşire char *fgets(char *s, int size, FILE *stream); // citeşte până la (inclusiv) linie nouă, sau max. size - 1 caractere

Exemple #i n c l u d e <s t d i o. h> v o i d c a t ( FILE f i ) // a f i s e a z a f i s i e r u l l a s t d o u t { i n t c ; w h i l e ( ( c = f g e t c ( f i ) )!= EOF) p u t c h a r ( c ) ; } v o i d main ( i n t argc, char argv [ ] ) { i f ( a r g c = = 1) c a t ( s t d i n ) ; // de l a i n t r a r e e l s e i f ( a r g c = = 2) { FILE f p = fopen ( argv [ 1 ], r ) ; i f ( f p = = NULL) f p r i n t f ( s t d e r r, can t open %s, argv [ 1 ] ) ; e l s e { c a t ( f p ) ; f c l o s e ( f p ) ; } } }

Observaţii: fişiere în mod dual Citirea şi scrierea dintr-un / într-un fişier se fac folosind acelaşi indicator de poziţie. Pentru un fişier deschis în mod dual (cu r+ sau w+ ): Nu se va citi direct după scriere fără a goli tampoanele ( cu funcţia fflush) sau a repoziţiona indicatorul de poziţie. Nu se scrie direct după citire fără repoziţionarea indicatorului sau fără sa ajungem la EOF.

Funcţii pentru cazuri de eroare void clearerr(file *stream); //resetează indicatorii de sfârşit de fişier //şi de eroare pentru fişierul dat int feof(file *stream); // dacă ret.!= 0: a ajuns la sfârşit de fişier int ferror(file *stream); // ret.!= 0 la eroare pt. acel fişier void perror(const char *s); //tipăreşte mesajul s dat de utilizator, un :, apoi descrierea erorii void exit(int status); //termină execuţia programului cu valoarea status

Fişiere binare Păstrează datele exact aşa cum au fost scrise, ca secvenţa de octeţi neinterpretaţi. Citirea şi scrierea se face direct, în format binar, fără a ţine cont de semnificaţia datelor scrise/citite (sunt văzute doar ca un număr de octeţi).

Prelucrarea fişierelor binare Se face folosind funcţiile: size t fread(void *ptr, size t size, size t nmemb, FILE *stream); size t fwrite(void *ptr, size t size, size t nmemb, FILE *stream); Funcţiile de citire/scriere directă: citesc/scriu nmemb obiecte de câte size octeţi returnează numărul obiectelor complete citite/scrise corect (dacă e mai mic decât nmemb cauza se află din feof şi ferror)

Exemple citire/scriere binara s i z e t r e a d i n t ( i n t pn, FILE stream ) { // c i t e s t e un i n t i n format b i n a r l a a d r e s a pn // r e t u r n e a z a nr. de v a l o r i i n t c i t i t e (0 sau 1) } r e t u r n f r e a d ( pn, s i z e o f ( i n t ), 1, stream ) ; s i z e t w r i t e d b l ( double x, FILE stream ){ // s c r i e un double x i n format b i n a r // r e t u r n. nr. de v a l o r i double s c r i s e (0 sau 1) } r e t u r n f w r i t e (&x, s i z e o f ( double ), 1, stream ) ;

Copierea a doua fisiere #i n c l u d e <s t d i o. h> #d e f i n e MAX 512 i n t f i l e c o p y ( FILE f i, FILE f o ) { char buf [MAX] ; i n t s i z e ; // nr de o c t e t i c i t i t i w h i l e (! f e o f ( f i ) ) { s i z e = f r e a d ( buf, 1, MAX, f i ) ; f w r i t e ( buf, 1, s i z e, f o ) ; // s c r i e doar a t a t i a o c t e t i c a t a c i t i t } i f ( f e r r o r ( f i ) f e r r o r ( f o ) ) r e t u r n 1; // e r o a r e } r e t u r n 0 ; // c o p i e r e ok

Funcţii de poziţionare în fişier long ftell(file *stream); // returnează pozitia de la începutul fişierului int fseek(file *stream, long offset, int whence); // poziţionare în fişierul stream Al treilea parametru la fseek (whence): punctul de referinţă pt. poziţionarea cu offset: SEEK SET începutul fişierului SEEK CUR punctul curent SEEK END sfârşitul fişierului

Funcţii de repoziţionare void rewind(file *stream); // repoziţionează indicatorul la început (echivalent cu (void) fseek(stream, 0L, SEEK SET), plus clearerr) Repoziţionarea trebuie efectuată: când dorim să ignorăm o anumită porţiune din fişier când fişierul a fost scris şi dorim să revenim să citim din el int fflush(file *stream); //scrie în fişier toate datele din tampoanele de date //rămase nescrise pt. fluxul de ieşire stream

Alte funcţii de lucru cu fişiere int remove(const char *filename); // şterge un fişier int rename(const char *old, const char *new); // redenumeşte un fişier Ambele funct returnează 0 la succes şi!= 0 la eroare. FILE *freopen(const char * filename, const char * mode, FILE * restrict stream); // deschide fişierul filename şi îl asociază cu fluxul stream // (redirectează fluxul logic stream în fişierul fizic filename) // returnează NULL în caz de eroare, stream la succes // închide un eventual fişier asociat anterior cu stream // se poate folosi pentru redirectarea stdin, stdout, stderr