KonNDor Posted January 2, 2021 Report Posted January 2, 2021 (edited) Salutare. Sunt clasa a XI-a. Lucrez la un proiect dat drept tema, C++. Fiind singurul care lucreaza la asa ceva, nu pot sa cer ajutorul altui coleg, asa ca vin la voi :-). Pe scurt, am o baza de date ( txt file ) pentru o clasa de elevi. Fiecare elev este definit de structura: struct Elev { int id; char nume[30]; char prenume[30]; float medie; long long cnp; }elev; Problema sta in felul urmator: Trebuie sa sterg un elev din baza de date si campul de date aferent lui. Am gasit pe stackoverflow ceva in genul si am inteles ideea principala: copiez tot intr-un fisier temporar, remove, rename. Am inteles cum pot sa sterg o linie din fisier, dar nu si un bloc de text. Mai mult, pe consola imi afiseaza " Elevul nu exista ", desi am introdus corect cnp-ul, deci nu intra in: if( cnp_sters == elev.cnp ) Subprogramul este acesta: void Stergere_Elev() { ifstream fin; ofstream fout; fin.open("Baza.txt"); fout.open("Temp.txt"); system("cls"); cout<<"\n***************************\n\n"; int cnp_sters; bool Exista_Elev = false; cout<<"CNP: "; cin>>cnp_sters; while( fin >> elev.id >> elev.nume >> elev.prenume >> elev.medie >> elev.cnp) // Nu am inteles foarte bine ce face { if ( cnp_sters != elev.cnp ) { fout<<"1. ID : "<<elev.id<<"\n"; fout<<"2. NUME : "<<elev.nume<<' '<<"\n"; fout<<"3. PRENUME: "<<elev.prenume<<"\n"; fout<<"4. MEDIE : "<<elev.medie<<"\n"; fout<<"5. CNP : "<<elev.cnp<<"\n\n"; } if( cnp_sters == elev.cnp) bool Exista_Elev = true; } fin.clear(); fin.seekg(0, ios::beg); fin.close(); fout.close(); remove ("Baza.txt"); rename ("Temp.txt", "Baza.txt"); if ( Exista_Elev == true) cout<<"Elevul a fost sters cu succes"; else cout<<"\nElevul nu exista.\n"; cout<<"\n***************************\n"; } In baza de date, elevul apare sub forma: 1. ID : 1 2. NUME : C 3. PRENUME: A 4. MEDIE : 9.02 5. CNP : 12345 1. ID : 123 2. NUME : M 3. PRENUME: R 4. MEDIE : 8 5. CNP : 1234 Pe scurt: Cum sterg un bloc de text atunci cand o linie din el trebuie eliminata? Ma puteti ajuta cu o idee? Edited January 2, 2021 by KonNDor Quote
Moderators Dragos Posted January 2, 2021 Moderators Report Posted January 2, 2021 Daca ordinea datelor (ID, nume, prenume, medie, CNP) nu se schimba, poti sa le citesti pe toate intr-un array si dupa, cand ai cnp-ul, sa stergi array[pozitie-cnp-gasit] si 5 elemente mai sus (4 valori plus elementul cu spatiu). Alternativ, poti face un array de array si sa stergi subarray-ul care contine cnp-ul. Dupa ce ai scos elevul din oricare din variantele de mai sus, trebuie doar sa-i scrii pe restul ramasi in fisier. Quote
Active Members vatman32 Posted January 2, 2021 Active Members Report Posted January 2, 2021 Cat pentru tema de casa, varianta prezentata de @Dragos e buna insa... Daca e cazul sa si prezinti pe larg, ori vii cu alta varianta sau te duci cu aia si le explici ca e un exemplar ce poate fi optimizat intrucat daca ai 5000 de elevi, nu te apuci sa ii rescrii pe toti la nesfarsit. Teoretic ar trebui sa scapi usor si rapid de intrebarea "Pai si cum ai fi optimizat?" daca prezinti exact varianta de care ai intrebat si anume "sterg doar blocul de text respectiv". Nu (prea) lucrez in C++ dar am observat niste hibe prin cod.. in prima faza structura acelui fisier ce joaca rol de baza de date. Nu vad cum sa iti gaseasca programul structura aia si anume "1. Nume 2. CNP 3. etc). De asta nu iti gaseste elevul, in realitate nu citeste corect. Dai un cout la elev.cnp, ori contine si alte chestii (spatii, 4. etc) si nu-l recunoaste ori nu e regasit deloc. Quote