Vous êtes sur la page 1sur 22

TEMA LUCRARII:

PROFESOR COORDONATOR: ZELD JENICA ELEV: JIPA COSMIN CLASA XII-A

CUPRINS

1. MOTIVA IE3

2. INTRODUCERE IN FISIERE..............................................4
3. DEFINITIE SI EXEMPLE.7 4. TIPURI DE FISIERE.11 5. APLICATII17 6. BIBLIOGRAFIE.................................................................23

1. MOTIVA IE Limbajul C++ apare la nceputul anilor 80 i l are ca autor pe Bjarne Stroustrup. El este o variant de limbaj C mbuntit, mai riguroas i mai puternic, completat cu construciile necesare aplicrii principiilor programrii orientate pe obiecte (POO). Limbajul C++ pstreaz toate elementele limbajului C, beneficiind de eficiena i flexibilitatea acestuia. Limbajul C++ este un superset al limbajului C. Incompatibilitile sunt minore, de aceea, modulele C pot fi ncorporate n proiecte C++ cu un efort minim. Un program scris n limbajul C (sau C++) este compus din unul sau mai multe fiiere surs. Un fiier surs este un fiier text care conine codul surs (n limbajul C) al unui program. Fiecare fiier surs conine una sau mai multe funcii i eventual, referine ctre unul sau mai multe fiiere header . Lucrul cu fi iere este indispensabil oricrui programator si de aici motiva ia temei alese.

2. INTRODUCERE IN FISIERE Funcia principal a unui program este numit main. Execuia programului ncepe cu execuia acestei funcii, care poate apela, la rndul ei, alte funcii. Toate funciile folosite n program trebuie descrise n fiierele surs (cele scrise de ctre programator), n fiiere header (funciile predefinite, existente n limbaj), sau n biblioteci de funcii. Un fiier header este un fiier aflat n sistem sau creat de ctre programator, care conine declaraii i definiii de funcii i variabile. Aciunile din fiecare funcie sunt codificate prin instruciuni . Exist mai multe tipuri de instruciuni, care vor fi discutate n capitolul urmtor. O instruciune este orice expresie valid (de obicei, o asignare sau un apel de funcie), urmat de simbolul ;. n figura 2.2.b. este dat un exemplu de instruciune simpl. Uneori, ca instruciune poate apare instruciunea nul (doar ;), sau instruciunea compus (privit ca o succesiune de instruciuni simple, ncadrate ntre acoladele delimitatoare {}.

F F FUNCII
Instruciunea1 Instruciunea2 Instruciunea3

I INSTRUCIUNI

E EXPRESII O Operanzi

E Expresie;

. . . .
2 2.2.a. 2 2.2.b. F Figura 2.2. Funcie, instruciune, expresie

O Operatori 2.2.c.

Functiile trebuie descrise fie in fisierele sursa, fie in fisiere separate numite fisiere header, fie in biblioteci de functii Functia main are urmatoarea forma: void main( )
4

{instructiuni; } Pentru a nelege mai bine noiunile prezentate, s considerm un exemplu foarte simplu. Programul urmtor afieaz pe ecran un mesaj (mesajul Primul meu program). Informaia de prelucrat (de intrare) este nsui mesajul (o constant ir), iar prelucrarea ei const n afiarea pe ecran. Exemplu: #include <iostream.h> // linia 1 void main() // linia 2 - antetul funciei main { /* linia 3 - nceputul corpului funciei, a unei intruciuni compuse */ cout<<Primul meu program in limbajul C++;// linia 5 } // linia6-sfritul corpului funciei Prima linie este o directiv preprocesor (indicat de simbolul #) care determin includerea n fiierul surs a fiierului header cu numele iostream.h. Acest header permite realizarea afirii pe monitor. Programul conine o singur funcie, funcia principal, numit main, al crui antet (linia 2) indic: - tipul valorii returnate de funcie (void, ceea ce nseamn c funcia nu returneaz nici o valoare) - numele funciei (main) - lista argumentelor primite de funcie, ncadrat de cele 2 paranteze rotunde. Funciile comunic ntre ele prin argumente. Aceste argumente reprezint datele de intrare ale funciei. n cazul nostru, nu avem nici un argument n acea list, deci puteam s scriem antetul funciei i astfel: void main(void) Ceea ce urmeaz dup simbolul //, pn la sfritul liniei, este un comentariu, care va fi ignorat de ctre compilator. Comentariul poate conine un text explicativ; informaii lmuritoare la anumite aspecte ale problemei sau observaii. Dac vrem s folosim un comentariu care cuprinde mai multe linii, vom delimita nceputul acestuia indicat prin simbolulurile /*, iar sfritul prin */ (vezi liniile 3, 4). Introducerea comentariilor n programele surs uureaz nelegerea acestora. n general, se recomand introducerea unor
5

comentarii dup antetul unei funciei, pentru a preciza prelucrrile efectuate n funcie, anumite limite impuse datelor de intrare, etc. Cele doua paranteze se ataseaza oricarei functii. Intre ele se scriu optional anumiti parametri ( in acest caz lipsesc) O functie poate intoarce un rezultat. Daca nu intoarce nici un rezultat spunem ca tipul rezultatului este void. Exista functii cu rezultat de tip real, intreg etc. De asemenea, programul poate contine si declaratii de variabile globale adica variabile cu care pot lucra toate functiile care il alcatuiesc. Instructiunile care pot aparea sunt fie expresii fie implementari ale structurilor de control ca if, for, while etc. nceputul i sfritul corpului funciei main sunt indicate de cele dou acoalade { (linia3) i }(linia 6). Corpul funciei (linia 5) este format dintr-o singur instruciune, care implementeaz o operaie de scriere. Cuvantul cout este un cuvnt predefinit al limbajului C++ - console output care desemneaz dispozitivul logic de iesire; simbolul << este operatorul de transfer a informaiei. Folosite astfel, se deschide un canal de comunicaie a datelor ctre dispozitivul de ieire, n cazul acesta, monitorul. Dup operator se specific informaiile care vor fi afiate (n acest exemplu, un ir de caractere constant). Faptul c este un ir constant de caractere este indicat de ghilimelele care l ncadreaz. La sfritul instruciunii care implementeaz operaia de scriere, apare;

2.DEFINITIE SI EXEMPLE FISIERUL este o colectie de date omogene stocate pe suport extern si accesata printr-un nume, care reprezinta numele fisierului. In practic, programele lucreaz cu un volum mare de date. Stocarea acestora se face pe diverse suporturi magnetice (hard-disc, dischet) sub form de fiiere. Exemple. 1. Programele sub form executabil sunt memorate pe suport sub form de fiiere. Colecia de date este dat de instruciunile n cod main care alctuiesc programul. Se recunosc dup extensia numelui care este .exe sau .corn. 2. Programele n format surs (adic textul introdus de programator) sunt stocate si ele sub form de fiiere. Si acestea pot fi recunoscute dup extensia lor - .pas pentru surse pascal, .cpp pentru surse C++. Aici colecia de date este constituit de caracterele care alctuiesc programul.
3. Tot sub form de fiiere sunt memorate informaiile de natur economic. De exemplu, un fiier "de materiale" retine informaii asupra materialelor utilizate ntr-o unitate productiv. Astfel, pentru fiecare material se cunoate numele, unitatea de msur (buci, kilograme) cantitatea existent n stoc etc. Informaiile referitoare la un material constituie o nregistrare, iar ansamblul nregistrrilor constituie fiierul propriu-zis.

O parte a puterii limbajului C++ consta in biblioteca de functii puse la dispozitia programatorului. Declaratiile diferitelor functii sunt grupate in fisiere antet (header). iostream.h - contine functii de introducere - extragere a datelor Functiile utilizate pina in acest moment (de ex: getchar, printf, gets, etc.) opereaza cu fisierele standard de introducere si extragere: stdin(implicit tastatura) si

stdout (implicit monitorul). Prin redirectare aceste fisiere standard se pot asocia cu alte fisiere. Exemplu: fisier_exe <fisier_1 >fisier_2 In acest caz preluarea informatiilor se face din fisier_1, iar afisarea informatiilor de iesire se face in fisier_2. Urmatoarele functii opereaza cu fisiere specificate de utilizator:

pentru un caracter: int getc(FILE *fis);- returneaza un caracter din fisierul precizat convertit la un intreg fara semn, iar la eroare returneaza EOF int ungetc(int c, FILE *fis);- inapoiaza caracterul c in fisierul deschis pentru citire int putc(int c, FILE * fis); - trimite caracterul in fisierul deschis pentru scriere, la eroare returneaza EOF
o

pentru un sir de caractere: char *fgets(char *s, int n, FILE *fis);- citeste maxim n-1 caractere sau pina la '\n' inclusiv, si le depune in s, adauga la sfirsit '\0' si returneaza adresa sirului. La eroare intoarce valoarea NULL int fputs(const char *s, FILE *fis); - scrie sirul in fisier, fara caracterul '\0'. La eroare intoarce EOF.
o

pentru scriere si citire cu format: int fscanf (FILE *fis, const char *format [, adresa, ...]); - numarul de adrese trebuie sa corespunda cu numarul de specificatori de format. Formatul contine - caractere spatii - se sare peste spatii pina la primul caracter nespatiu - caractere obisnuite - caractere ASCII, mai putin '%', se trece peste un caracter corespunzator in intrare
o

specificatorul de format: % [*] [width] type * - se sare peste urmatoarea data width - nr. de maxim de caractere ce se citesc type - tipul informatiei citite: o - octal , u - fara semn, x,X - hexa d - zecimal, l - long, f - float, lf - double, e,E- format stiintific, c - char, s - sir

int fprintf (FILE *fis, const char *format [, argum...]); - preia un sir de argumente si le aplica formatul corespunzator, dupa care le scrie in fisierul dat. Formatul contine - caractere obisnuite, care apar la fel la iesire

specificatori de format (egal sau mai mic decit numarul de argumente): % [fanion] [width][.prec] type fanion - alinierea la dreapta sau stinga, prezenta semnului, etc. width - numarul minim de caractere ce se afiseaza prec - precizia conio.h - functii de intrare, iesire pentru consola

void window(int left, int top, int right, int bottom);- defineste o fereastra text precizata prin colturile stinga sus, dreapta jos void clreol( void );- sterge intr-o fereastra text de la cursor pina la sfirsirul liniei void clrscr( void );- sterge fereastra text activa si muta cursorul in pozitia 1,1 void gotoxy( int x, int y );- muta cursorul la coordonatele date int wherex( void );- returneaza coordonata curenta x int wherey( void );- returneaza coordonata curenta y int getch( void ); - citeste un caracter fara a-l afisa la consola int getche( void ); - citeste si afiseaza caracterul int kbhit( void ); - verifica daca a fost apasata o tasta int putch( int c );- pune un caracter in fereastra text curenta.

stdlib.h - contine tipuri, variabile si functii uzuale


#define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b))
o

pentru conversia unui sir:


9

double atof(const char *s); - returneaza valoarea reala obtinuta prin conversia sirului, iar la eroare valoarea 0 int atoi(const char *s); - converteste sirul la un intreg long atol(const char *s); - converteste sirul la un long pentru terminarea programului: void exit(int status); - termina programul si inchide toate fisierele. Parametrul status indica terminare normala (valoarea 0) sau anormala. void abort(void);- termina anormal programul
o

pentru alocare dinamica: void free(void *bloc);- elibereaza memorie alocata dinamic anterior void *malloc(dim_t nr);- aloca nr locatii de memorie de cite sizeof(dim_t) octeti. La succes returneaza adresa de inceput a zonei alocate, la eroare returneaza NULL
o

cautare binara: void * bsearch(const void *key, const void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));- returneaza adresa primei intrari din tablou care coincide cu parametrul cautat si zero daca acesta nu exista in tablou. ( key- adresa cheii cautate, base- inceputul tabloului, nelem- nr.elemente din tablou, width- dim. unui elem. de tablou, fcmp- functia de comparare definita de utilizator si care primeste doi parametrii )
o o

sortare cu algorimul Quicksort:

void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));- sorteaza tabloul dat.

10

4.

TIPURI DE FISIERE

a) b)

FISIERE TEXT; FISIERE BINARE ;

1. FISIERE TEXT Aceste fisiere se caracterizeaza prin urmatoarele: - datele sunt memorate sub forma unei succesiuni de caractere - caracterele sunt memorate in codul ASCII - fisierul se termina cu caracterul EOF - este format din una sau mai multe linii care se termina cu caracterul newline (\n) - o variabila speciala numita pointer retine intotdeauna un octet al fisierului 1.1. Citiri / scrieri cu format Acestea sun caracterizate prin: - latime - width - se utilizeaza la scriere si are rolul de a stabili numarul de caracatere utilizate pentru afisarea unei date;

11

- precizie - precision - se utilizeaza la scriere atunci cand se foloseste o variabila reala, stabileste numarul de zecimale care vor fi afisate pentru valoare; - caracterul de umplere - fill - se utilizeaza la scriere in cazul in care data propriuzisa ocupa mai putini octeti decat latimea si precizeaza caracterul care se afiseaza in spatiile neocupate; - alinierea - left sau right - se utilizeaza cand data ocupa mai putin decat latimea si se precizeaza unde anume sa fie afisata - stanga sau drepta - salt sau nu peste caractere albe - se utilizeaza la citire * Pentru formatarea citirii / scrierii se utilizeaza varibilele: precision , wihth, fill Accesul la aceste varibile se face cu ajutorul unor functii speciale numite manipulatori. Pentru a le putea utiliza in program trebuie inclusa directiva #<iomanip.h> Manipulatorii sunt inclusi in expresiile de citire/scriere astfel: - setw (int) - stabileste latimea int pe care este afisata variabila - setprecision(int) - stabileste numarul de zecimale int care sunt afisate - setfill(char) - stabileste caracterul de umplere char a pozitiilor ramase libere Exemplu. #include<iostream.h> #include<iomanip.h> #include<conio.h> void main() { double a=0.123456789; cout<<setw(20)<<setfill('$')<<setprecision(2)<<a; getch();
12

} Afisarea se poate face pe 20 pozitii ; pe pozitiile ramase libere se afiseaza caracterul $ , variabila a va fi afisata cu 2 zecimale. *Pentru formatarea intrarilor / iesirilor se utilizeaza variabila: flags care utilizeaza comenzile: - skipws - sunt sarite caracterele albe care preced valoarea ce trebuie citita - left - datele se tiparesc aliniate la stanga - right - datele se tiparesc aliniate la dreapta - internal - se fiseaza semnaul la stinga si numarul la drepta - dec - conversie in zecimal - oct - conversie in octal - hex - conversie in hexazecimal - showbase - afisarea indicatorului de baza - showpoint - forteaza afisarea punctului zecimal - uppercase - in cazul afisarii in hexazecimal se vor utiliza literele mari (A,B,..F) - showpos - valorile afisate sunt precedate de semn - scientific - afisarea valorilor se face prin utilizarea formei stiintifice (1e-8) - fixed - afisarea valorilor se face prin utilizarea formai normale Variabila flags se utilizeaza in doua moduri: setiosflags(masca) - pentru setarea bitilor accesati resetiosflags(masca) - pentru resetarea bitilor accesati

13

Pentru a avea acces la comanzile cu care lucreaza flags numele lor vor fi precedate de ios:: masca este formata din una sau mai multe grupe de comenzi de forma: ios::comanda separate intre ele de operatorul logic | (SAU-pe biti) Exemplu de masca: (ios::internal | ios::showpos | ios::right) Exemplu: #include<iostream.h> #include<iomanip.h> #include<conio.h> #include<math.h> void main() { double a,b,c,d,e,f; cout<<"Introduceti primul numar "<<" "<<"a=";cin>>a; cout<<"Introduceti al doilea numar "<<" "<<"b=";cin>>b; c=a/b; d=a*b; e=sqrt(d); f=d*d; cout<<endl; cout<<"Rezultatul impartirii "<<" "<<"a : b =" <<setw(100)<<setfill(' ')<<setprecision(10) <<setiosflags(ios::left|ios::showpos|ios::fixed)<<c; cout<<endl; cout<<"Rezultatul inmultirii "<<" "<<"a x b =" <<setw(100)<<setfill(' ')<<setprecision(10) <<setiosflags(ios::left|ios::showpos|ios::fixed)<<d; cout<<endl; cout<<"Radicalul inmultirii este "<<" " <<setw(100)<<setfill(' ')<<setprecision(20) <<setiosflags(ios::left|ios::showpos|ios::fixed)<<e;
14

cout<<endl; cout<<"Patratul inmultirii este "<<" " <<setw(100)<<setfill(' ')<<setprecision(20) <<setiosflags(ios::left|ios::showpos|ios::fixed)<<f; getch(); }

1.2. Declararea fisierelor text memorate pe suport magnetic. Cand se lucreaza cu fisiere pe suport magnetic in program trebuie inclusa directiva: #include<fstream.h> daca <iostream.h> Pentru a lucra usor asupra fisierelor sunt definite comenzile: - in - deschide fisierul pentru citire - out - deschide fisierul pentru scriere - ate - salt la sfirsitul fisierului dupa deschiderea acestui - app - deschide fisierul pentru a scrie la sfirsitul lui - trunc - daca fisierul care se deaschide exista in locul lui se creaza altul - nocreate - daschide fisierul daca acesta exista (nu se creaza altul) - noreplace - daca fisierul exista el poate fi deschis numai pentru consultare - binary - fisier binar. Se utilizeaza constructorul inplicit al clasei ofstream(); apoi se utilizeaza metoda open in forma generala Inainte de a lucra cu un fisier acesta trebuie declarat. Forma generala a declaratiei: fstream nume_logic("nume_fizic" , mod_de_deschidere) Exemplu1: Declar un fisier cu numele fizic fis.txt care se va gasi in radacina (c:\\) , cu numele logic f , fisierul este declarat in vedera crearii lui (ios::out) fstream f("c:\\fis.txt",ios::out); utilizam acesta directiva poatei fi scoasa

15

Exemplul2. Declar doua fisiere, unul (f) pentru citire si celalat (g) pentru scriere fstream f("c:\\fis1.txt",ios::in), g("c:\\fis2.txt",ios::out); In cazul in care numele fisierului trebuie citit de la tastatura declaratia fisierului trebuie sa contina numele sau si trebuie plasata dupa citirea sirului respectiv astfel: char nume_fisier[20] ; cout<<"Numele fisierului este ";cin>>nume_fisier ; fstream f(nume_fisier, ios::out); Dupa deschiderea si prelucrarea unui fisier acesta trebuie inchis astfel: nume_fisier.close() , in cazul nostru f.close() Exemplu de creare a unui fisier de tip text in c:\ : #include<iostream.h> #include<fstream.h> #include<iomanip.h> #include<conio.h> void main() { fstream f("c:\\fis.txt",ios::out); getch(); } 1.3. Prelucrarea fisierelor de tip text Prelucrarea unui fisier se face dupa urmatorul algoritm: while(daca nu este sfirsit de fisier) { citeste ;
16

prelucreaza ; } Pentru a preciza sfirsitul de fisier care se testeaza in paranteza de dupa while se scrie:! nume_fisier.eof() Atentie! Functia eof() nu citeste ci doar testeaza daca anterior a fost detectat sfarsitul de fisier

5.

APLICATII

Exemplul1. Creez un fisier fis.txt in d:\ cu intrare de la tastatura (scriu in el de la tastatura).In acest exemplu nu sunt scrise caracterele albe(deci intre cuvintele scrise nu este spatiu.Ca sa termin scrierea apas consecutiv tastele CTRL+Z (echivalent cu EOF) #include<iostream.h> #include<fstream.h> #include<iomanip.h> #include<conio.h> void main() { fstream f("d:\\fis.txt",ios::out); char x; while(cin>>x) f<<x; f.close(); } Exemplul2. Creez acelasi fisier dar for fi scrise si caracterele albe. Aceasta sa realizat deoarece a fost introdusa comanda resetiosflags(ios::skipws) #include<iostream.h>
17

#include<fstream.h> #include<iomanip.h> #include<conio.h> void main() { fstream f("d:\\fis.txt",ios::out); char x; while(cin>>resetiosflags(ios::skipws)>>x) f<<x; f.close(); getch(); } Exemplul3. Afisez fisierul creat la exemplul2 #include<iostream.h> #include<fstream.h> #include<iomanip.h> #include<conio.h> void main() { fstream f("d:\\fis.txt",ios::in); char x; while(f>>resetiosflags(ios::skipws)>>x) cout<<x; f.close(); getch(); } Exemplul4. Scriu la sfirsitul fisierului creat la exemplul2 #include<iostream.h> #include<fstream.h> #include<iomanip.h> #include<conio.h> void main() { fstream f("d:\\fis.txt",ios::app); char x; while(cin>>resetiosflags(ios::skipws)>>x) f<<x;
18

f.close(); getch(); }

Exemplul5. Creez un fisier al carui nume il dau de la tastatura si scriu in el. #include<iostream.h> #include<fstream.h> #include<iomanip.h> #include<conio.h> void main() { char fisier[10]; cout<<"Numele fisierului este ";cin>>fisier; fstream f(fisier,ios::out); char x; while(cin>>resetiosflags(ios::skipws)>>x) f<<x; f.close(); getch(); } Observatie: Cand scriu numele fisierului trebuie sa specific si locatia lui astfel: c:\nume_fisier.txt sau d:\nume_fisier.txt Exemplul 6. Cuvantul "FINISH" se adauga la sfarsitul fisierului creat la exemplul2. #include<string.h> #include<fstream.h> #include<stdlib.h> #include<iomanip.h> #include<conio.h> void main() { fstream f("d:\\fis.txt",ios::in|ios::out); char c[100];
19

f>>resetiosflags(ios::skipws)>>c ;cout<<c; f.seekp(0,ios::end); strcpy(c,"FINISH"); f<<resetiosflags(ios::skipws)<<c; f.close(); getch(); } & Functia: nume_fisier.seekp(0,ios::end) - pozitioneaza pointerul in fisierul precizat - primul parametru reprezinta pozitia pointerului - al doilea parametru reprezinta reperul in raport de care este calculata pozitia Sunt definite trei constante: end - sfarsit de fisier beg - inceput de fisier cur - pozitia curenta in fisier & Functia : nume_fisier.tellp() - returneaza pozitia pointerului la un moment dat. Exemplul7. Se convertesc primele n numere naturale in octal si hexazecimal #include<iostream.h> #include<fstream.h> #include<iomanip.h> #include<conio.h> void main() { fstream f("C:\\numere.txt",ios::out,ios::in); int i,n; cout<<"Introduce numarul n= ";cin>>n; for(i=1;i<=n;i++) { f<<setw(10)<<oct<<i; f<<setw(10)<<dec<<i;
20

f<<setw(10)<<setiosflags(ios::uppercase)<<hex<<i<<endl; }; f.close(); getch(); } 2. FISIERE BINARE Caracteristici: - fisierele sunt alcatuite din mai multe inregistrari de acelasi tip (int , struct, etc) - datele sunt memorate in format intern, iar fisierele se termina tot cu EOF - pentru deschiderea unui fisier binar se utilizeaza ios::binary - fisierele lucreaza cu variabile de tip pointer. O astfel de variabila retine o anumita adresa a unei alte variabile. Ea se declara in felul urmator: int a, *adr_a=&a , variabila *adr_a a fost initializata cu adresa variabilei a Variabila *adr_a este de tip poiner Pentru a obtine adresa unei variabile , variabila este precedata de operatorul & Daca avem o variabila a de tip int* si o variabila b de tip float* nu este permisa atribuire de tipul a=b , aceasta atribuire se poate face astfel a=(int*)b - scrierea unei variabile de tip pointer adr_p intr-un fisier se face utilizand: nume_fisier.write((char*) adr_p,sizeof(p)) - citirea unei variabile de tip poiter adr_p dintr-un fisier se face utilizand: nume_fisier.read((char*)adr_p,sizeof(p)) Prin aceste comenzi de fapt se scrie respectiv citeste continutul variabilei p, numarul de caractere scrise sau citite fiind date de lungimea variabilei p prin comanda sizeof(p).

21

BIBLIOGRAFIE 1. Manual de INFORMATICA clasa a IX-a, Editura L&S Infomat, Autor Tudor Sorin
2. Manual de INFORMATICA clasa a X-a, Editura L&S Infomat, Autor Tudor

Sorin 3. Algoritmi fundamentali. O perspectiva C++, Editura LIBRIS, Autor Razvan Andonie

22

Vous aimerez peut-être aussi