Jump to content
KonNDor

Stergere bloc text, fisier txt

Recommended Posts

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 by KonNDor
Link to comment
Share on other sites

  • Moderators

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.

Link to comment
Share on other sites

  • Active Members

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...