Aiuto Rubrica telefonica

di il
5 risposte

Aiuto Rubrica telefonica

Buongiorno a tutti, sto creando una rubrica telefonica in c++, ma mi sono bloccato con la funzione per modificare il nome e il numero già esistente.
cosa sbaglio in questa funzione?

void modifica(){
    ifstream fin;
    fin.open(NOMEARCH.c_str(), ios::in | ios::binary);
    bool trovato=false;
    int n;
    cout<<"Inserire l'id da modificare: ";
    cin>>n;
    while(fin.read((char*) &rubrica, sizeof(rubrica))){
        if(n==rubrica.id){
            trovato=true;
        }
    }
    if(trovato){
        ofstream fout;
        fout.open(NOMEARCH.c_str(), ios::app);
        cin.ignore();
        cout<<"Inserire il nome: ";
        cin.getline(rubrica.nome, 20);
        cout<<"Inserire il numero: ";
        cin>>rubrica.numero;
        fout.write((char*) &rubrica, sizeof(rubrica));
    }
    else{
        cout<<"Id non presente in rubrica"<<endl;
    }
    
}

5 Risposte

  • Re: Aiuto Rubrica telefonica

    Cosa sbagli?

    Ma cosa succede?

    P.S. come modifichi se il file lo apri in append?

    P.P.S. i file non li chiudi mai?
  • Re: Aiuto Rubrica telefonica

    oregon ha scritto:


    Cosa sbagli?

    Ma cosa succede?

    P.S. come modifichi se il file lo apri in append?

    P.P.S. i file non li chiudi mai?
    Dunque, questo esempio è un ampliamento di un esercizio preso da un libro, l'originale chiedeva solo di creare una rubrica e successivamente aggiungere un nuovo contatto, stampare l'intera rubrica e cercare un contatto. Io vorrei aggiungere la modifica e l'eliminazione di un contatto.

    1)Succede che non modifico il contatto, ma lo aggiungo in coda.
    2)Il file lo apro in append perchè credo sia giusto così andando a sovrascrivere un contatto. Se uso solo ios::out mi sovrascrive tutta la rubrica.
    3)I file non li ho chiusi perchè ero in test e ho dimenticato di farlo.
  • Re: Aiuto Rubrica telefonica

    In app non farai altro che aggiungere. Deve essere in out ma binary e devi conoscere le regole per farlo, regole che vanno studiate prima. Leggi questo

    https://courses.cs.vt.edu/cs2604/fall02/binio.htm
  • Re: Aiuto Rubrica telefonica

    oregon ha scritto:


    In app non farai altro che aggiungere. Deve essere in out ma binary e devi conoscere le regole per farlo, regole che vanno studiate prima. Leggi questo

    https://courses.cs.vt.edu/cs2604/fall02/binio.htm
    Ciao, con un pò di documentazione trovata in rete, oltre che al link che mi hai fornito, sono riuscito a trovare e sviluppare una funzione:
    
    void modifica(){
        fstream f;
        f.open(NOMEARCH.c_str(), ios::in | ios::out | ios::binary);
        bool trovato=false;
        int n;
        cout<<"Inserire l'id da modificare: ";
        cin>>n;
        while(f.read((char*) &rubrica, sizeof(rubrica))){
            if(n==rubrica.id){
                trovato=true;
                int pos=f.tellg();
                pos=pos-sizeof(rubrica);
                f.seekp(pos, ios::beg);
                cin.ignore();
                cout<<"Inserire il nome: ";
                cin.getline(rubrica.nome, 20);
                cout<<"Inserire il numero: ";
                cin>>rubrica.numero;
                f.write((char*)&rubrica, sizeof(rubrica));
            }
        }
        if(!trovato){
            cout<<"Id non presente in rubrica"<<endl;
        }
        f.close();
    }
    
    Premesso che funziona senza problemi, è corretta?
    Un'altra cosa: usare sempre fstream invece che di ofstream per la scrittura, e ifstream per la lettura, è comunque corretto?
  • Re: Aiuto Rubrica telefonica

    Sto provando la funzione di eliminazione ma non va proprio..
    
    void elimina(){
        ifstream fin;
        fin.open(NOMEARCH.c_str(), ios::in | ios::binary);
        int n;
        ofstream fout2("rubricaA.dat", ios::out | ios::binary);
        
        cout<<"Inserire l'id da cancellare: ";
        cin>>n;
       //fin>>rubrica.id;
        
        while(fin.read((char*)&rubrica, sizeof(rubrica))){
           
            if(n!=rubrica.id){
                fout2.write((char*) &rubrica, sizeof(rubrica));
            }
       }
        fin.close();
        fout2.close();
        
        remove("rubrica.dat");
        rename("rubricaA.dat", "rubrica.dat");
    }
    
    Qualcuno ha qualche suggerimento su come procedere?
Devi accedere o registrarti per scrivere nel forum
5 risposte