Documente Academic
Documente Profesional
Documente Cultură
Int credite[10] e un vector static si este bine sa nu ne bazam ca vom avea mereu fix 10
valori asa ca mai bine il destionam cu un int nrCredite (ca poate nu folosim toate cele 10 valori).
In constructor avem nevoie de int* (mai bine spunem ca trimitem un pointer la un vector.
De ce? Pentru ca pe anumite compilatoare , daca pui un int [10] si tu nu dai in main un vector de
10 risc sa am o eroare de compilare sau la executie.
Toti pointerii la vectorii statici sunt constanti.
Deci nu copiem vectorii cu egal!!
Pentru vectori statici nu alocam memorie ci doar o parcurgem cu for!!! La vectorii
dinamici alocam memorie.
La char static (char nume[50]) facem doar strcpy!! Si la char* alocam dinamic.
Ofstream e derivat din ostream.
La afisare (input stream) din fisier text avem cate o valoare pe linie si inainte de vector punem
numarul de elemente din vector!! Si fara comentarii!!
Nu avem spatii!! Daca vrem sa citeasca si spatii punem getline;
Fisiere binare
Serializare= se iau toate datele din memorie si se duc intr-o secventa continua de biti. E ca si
cum am liniariza ceva ce e imprastiat in heap.
//scriere
ofstream fisierDate(“studenti.dat”,ios::binary) //numele fisierului
//implicit toate fisierele scrise sunt text asa ca le schimbam in binar, pentru ca altfel descarcam
intr-un fisier text.
//implicit e trunc, nu vreau sa fac append
//daca fac append si voi tot apela acel fisier text va creste numarul de obiecte pentru ca se adauga
(append)
//aici lasam implicit trunc (putem si sa scriem dar oricum e implicit trunc)
if (fisierDate.is_open()) {
raport << s1;
raport << s2;
raport << s3;
//raport << s1 << s2 << s3;
fisierDate.write(s1);
La fisierele binare nu se scrie cu << pt ca face conversia la text pentru toate valorile. Testul
prin care verificam daca scriem binar sau text, e sa punem << (e ca si cum am scrie in fisier binar
ceva ce e text).
Sizeof() este foar bucata de Student, adica cat ocupa fiecare atribut si atat. Deci in fisierul binar
se scrie doar adresa care imi spune mie unde se gasesc notele. La campurile dinamice nu se scriu
adresele!
Varianta simpla nu merge pentru obiectele ce contin minim un camp dinamic!!
Serializarea e ca si cum am reconstrui noi intr-un fisier binar obiectul nostru bucatica cu
bucatica.
//prenume char[1000]
//varianta 1 - scriu tot vectorul static (ca oricum e mic – 1000 de caractere)
fisierBinar.write(this->prenume, sizeof(this->prenume));
//numele de vector e mereu pointer (nu scriu nici &-pt ca obtinem adresa pointerului si nu
pointerul in sine, si nu avem nici char pt ca este deja)
//sizeof de pointer intoarce 4, dar mai bine pun sizeof
//facultatea char*
//varianta 1 - aleg sa scriu facultatea sub forma unui buffer static de 100 caractere
char buffer[100];
strcpy(buffer, this->facultate);
fisierBinar.write(buffer, sizeof(buffer));//era inmultit cu char, dar char e 1
VECTORI
//daca e static doar citim, daca e alocat dinamic, trebuie sa alocam!!
//citesc numarul de credite - vector static
fisierBinar.read((char*)&this->nrCredite, sizeof(int));
//citesc creditele - toate odata
fisierBinar.read((char*)this->credite, sizeof(int) * this->nrCredite);
if (this->facultate != NULL)
delete[] this->facultate;
this->facultate = new char[strlen(bufferFacultate) + 1];
strcpy(this->facultate, bufferFacultate);
}
FISIERE BINARE - BOJA
MAIN: //citire
ifstream fisierStudenti("studenti.dat", ios::binary);
if (fisierStudenti.is_open()) {
Student s4;
s4.citireStudent(fisierStudenti);
cout << endl << " Date din fisier binar ";
cout << s4;
fisierStudenti.close();
}
else
cout << endl << "********************* NU am deschis fisierul !";
}