Eliminare record da file .dat

di il
3 risposte

Eliminare record da file .dat

Ciao ragazzi, vi spiego il mio problema.
Ho preso un esercizio dal libro che uso a scuola, che consiste nel creare una rubrica.
In pratica devo scrivere le funzioni per aggiungere un numero, modificare un numero, eliminare un numero, trovare un numero da nome e cognome, visualizzare tutti i numeri.

Il codice è questo:
#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;

struct Numero{
     char nome[15];
     char cognome[15];
     char cell[15];
}dato;

void addNum();
void showNum();
void findNum();
void modNum();

int main()
{
    bool exit_flag = false;
    int scelta;
    
    while(!exit_flag)
    {
         system("cls");
         cout<<"***********************\n";
         cout<<"* 1.Aggiungi Numero   *\n";
         cout<<"* 2.Modifica Numero   *\n";
         cout<<"* 3.Trova Nome        *\n";
         cout<<"* 4.Visualizza Numeri *\n";
         cout<<"* 5.Esci              *\n";
         cout<<"***********************\n";
         cout<<"\nScegli un'opzione: ";
         cin>>scelta;
         
         switch(scelta)
         {
              case 1: system("cls"); addNum(); break;
              case 2: system("cls"); modNum(); break;
              case 3: system("cls"); findNum(); break;
              case 4: system("cls"); showNum(); break;
              case 5: exit_flag = true; break;
              default: cout<<"\nErrore!"; getch();
         }
    }
    
    return 0;
}


//Procedure
void addNum()
{
     FILE *f;
     char directory[50];
     
     cout<<"Directory: ";
     cin>>directory;
     
     f = fopen(directory, "ab+");
     
     cout<<"\nNome: ";
     cin>>dato.nome;
     cout<<"Cognome: ";
     cin>>dato.cognome;
     cout<<"Numero/Telefono: ";
     cin>>dato.cell;
     

     fwrite(&dato, sizeof(Numero), 1, f);
     fclose(f);
     getch(); 
}

void showNum()
{
     int pos = 0;
     FILE *f;
     char directory[50];
     
     cout<<"Directory: ";
     cin>>directory;
     
     f = fopen(directory, "rb");
     
     if(f!=NULL)
     {
          while(!feof(f))
          {
               fseek(f, pos*sizeof(Numero), SEEK_SET);
               fread(&dato, sizeof(Numero), 1, f);
               if(!feof(f))
               {
                    cout<<"\nNome: "<<dato.nome<<endl;
                    cout<<"Cognome: "<<dato.cognome<<endl;
                    cout<<"Numero/Telefono: "<<dato.cell<<endl;
                    cout<<endl;
               }
               pos++;
          }
     }
     else
         cout<<"\nErrore!";
     fclose(f);
     getch();
}

void findNum()
{
     int pos = 0;
     bool find = false;
     FILE *f;
     char directory[50];
     char find_nome[15];
     char find_cognome[15];
     
     
     cout<<"Directory: ";
     cin>>directory;
     cout<<"\nInserisci Nome da Trovare: ";
     cin>>find_nome;
     cout<<"Inserisci Cognome da Trovare: ";
     cin>>find_cognome;
     
     f = fopen(directory, "rb");
     
     if(f!=NULL)
     {
          while(!feof(f))
          {
               fseek(f, pos*sizeof(Numero), SEEK_SET);
               fread(&dato, sizeof(Numero), 1, f);
               if((strcmp(dato.nome, find_nome) == 0 && strcmp(dato.cognome, find_cognome) == 0) && !feof(f))
               {
                    cout<<"\nNome: "<<dato.nome<<endl;
                    cout<<"Cognome: "<<dato.cognome<<endl;
                    cout<<"Numero: "<<dato.cell<<endl;
                    find = true;
               }
               pos++;
          }
          
          if(!find)
               cout<<"\nNessun Numero Trovato!";
          fclose(f);
     }
     else
         cout<<"\nErrore!";
     
     getch();
}

void modNum()
{
     int pos = 0;
     int mod;
     FILE *f;
     char directory[50];
     
     cout<<"Directory: ";
     cin>>directory;
     
     f = fopen(directory, "rb+");
     
     if(f!=NULL)
     {
          while(!feof(f))
          {
               fseek(f, pos*sizeof(Numero), SEEK_SET);
               fread(&dato, sizeof(Numero), 1, f);
               if(!feof(f))
               {
                    cout<<endl<<pos+1<<"# Numero"<<endl;       
                    cout<<"Nome: "<<dato.nome<<endl;
                    cout<<"Cognome: "<<dato.cognome<<endl;
                    cout<<"Numero/Telefono: "<<dato.cell<<endl;
                    cout<<endl;
               }
               pos++;
          }
          cout<<"Scegli un numero: ";
          cin>>mod;
          
          cout<<"\nNuovo Nome: ";
          cin>>dato.nome;
          cout<<"Nuovo Cognome: ";
          cin>>dato.cognome;
          cout<<"Nuovo Numero: ";
          cin>>dato.cell;
          fseek(f, (mod-1)*sizeof(Numero), SEEK_SET);
          fwrite(&dato, sizeof(Numero), 1, f);
          
          cout<<"\nNumero Modificato!";
          
     }
     else
         cout<<"\nErrore!";
     fclose(f);
     getch();
}
Sono riuscito a scrivere tutte le funzioni, tranne quella per eliminare un numero.
Come posso eliminare un record dal file? Non ho proprio la minima idea di come fare..

3 Risposte

  • Re: Eliminare record da file .dat

    Non ho guardato molto attentamente il tuo programma, ma penso che tu abbia due possibilità: riscrivere il file .dat senza il record richiesto, oppure aggiungere un campo booleano 'deleted' che andrai a riscrivere in 'true' quando si tratterà di cancellare un record.
  • Re: Eliminare record da file .dat

    Appena ho un po' di tempo provo, e poi posto il codice
  • Re: Eliminare record da file .dat

    Ciao Andrea, alla fine ho preso un altro esercizio praticamente identico, solo che al posto della rubrica ci stanno dati du un utente.
    Quindi bisognava scrivere la funzione per aggiungere, modificare, eliminare e visualizzare gli utenti.
    La funzione per eliminare, ho praticamente riscritto il file senza riscrivere il record da eliminare.
    Funziona tutto

    Codice:
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    struct User{
        char username[15];
        char password[15];
        char nome[15];
        char cognome[15];
        bool elimina;
    }dato;
    
    void newUser();
    void showUser();
    void modUser();
    void delUser();
    
    int main()
    {
        bool exit_flag = false;
        int scelta;
    
        while(!exit_flag)
        {
            system("cls");
            cout<<"***********************\n";
            cout<<"* 1.Nuovo Utente      *\n";
            cout<<"* 2.Modifica Utente   *\n";
            cout<<"* 3.Elimina Utente    *\n";
            cout<<"* 4.Visualizza Utenti *\n";
            cout<<"* 5.Esci              *\n";
            cout<<"***********************\n";
            cout<<"\nScegli un'opzione: ";
            cin>>scelta;
    
            switch(scelta)
            {
                case 1: system("cls"); newUser(); break;
                case 2: system("cls"); modUser(); break;
                case 3: system("cls"); delUser(); break;
                case 4: system("cls"); showUser(); break;
                case 5: exit_flag = true; break;
                default: cout<<"\nErrore!"; getch();
            }
        }
        return 0;
    }
    
    //Procedure
    void newUser()
    {
        FILE *f;
        char directory[50];
    
        cout<<"Directory: ";
        cin>>directory;
    
        f = fopen(directory, "ab+");
    
        cout<<"\nNome: ";
        cin>>dato.nome;
        cout<<"Cognome: ";
        cin>>dato.cognome;
        cout<<"Username: ";
        cin>>dato.username;
        cout<<"Password: ";
        cin>>dato.password;
        dato.elimina = false;
    
        fwrite(&dato, sizeof(User), 1, f);
        fclose(f);
        cout<<"\nNuovo Utente Aggiunto!";
        getch();
    }
    
    void showUser()
    {
        int pos = 0;
        FILE *f;
        char directory[50];
    
        cout<<"Directory: ";
        cin>>directory;
    
        f = fopen(directory, "rb");
    
        if(f!=NULL)
        {
            while(!feof(f))
            {
                fseek(f, pos*sizeof(User), SEEK_SET);
                fread(&dato, sizeof(User), 1, f);
                if(!feof(f))
                {
                    cout<<"\nNome: "<<dato.nome<<endl;
                    cout<<"Cognome: "<<dato.cognome<<endl;
                    cout<<"Userrname: "<<dato.username<<endl;
                    cout<<"Password: "<<dato.password<<endl;
                }
                pos++;
            }
            fclose(f);
        }
        else
            cout<<"\nErrore!";
        getch();
    }
    
    void modUser()
    {
        int pos = 0;
        int mod_user;
        FILE *f;
        char directory[50];
    
        cout<<"Directory: ";
        cin>>directory;
    
        f = fopen(directory, "rb");
    
        if(f!=NULL)
        {
            while(!feof(f))
            {
                fseek(f, pos*sizeof(User), SEEK_SET);
                fread(&dato, sizeof(User), 1, f);
                if(!feof(f))
                {
                    cout<<endl<<pos+1<<"# Utente"<<endl;
                    cout<<"Nome: "<<dato.nome<<endl;
                    cout<<"Cognome: "<<dato.cognome<<endl;
                    cout<<"Userrname: "<<dato.username<<endl;
                    cout<<"Password: "<<dato.password<<endl;
                }
                pos++;
            }
            fclose(f);
        }
        else
            cout<<"\nErrore!";
    
        cout<<"\nScegli Utente da Modificare: ";
        cin>>mod_user;
        if(mod_user>0 && mod_user<pos)
        {
            f = fopen(directory, "rb+");
            fseek(f, (mod_user-1)*sizeof(User), SEEK_SET);
            cout<<"\nNuovo Nome: ";
            cin>>dato.nome;
            cout<<"Nuovo Cognome: ";
            cin>>dato.cognome;
            cout<<"Nuovo Username: ";
            cin>>dato.username;
            cout<<"Nuova Password: ";
            cin>>dato.password;
            dato.elimina = false;
    
            fwrite(&dato, sizeof(User), 1, f);
            fclose(f);
            cout<<"\nUtente Modificato";
        }
        else
            cout<<"\nUtente Inesistente!";
        getch();
    }
    
    void delUser()
    {
        int pos = 0;
        int del_user;
        FILE *f;
        FILE *update;
        char directory[50];
    
        cout<<"Directory: ";
        cin>>directory;
    
        f = fopen(directory, "rb+");
    
        if(f!=NULL)
        {
            while(!feof(f))
            {
                fseek(f, pos*sizeof(User), SEEK_SET);
                fread(&dato, sizeof(User), 1, f);
                if(!feof(f))
                {
                    cout<<endl<<pos+1<<"# Utente"<<endl;
                    cout<<"Nome: "<<dato.nome<<endl;
                    cout<<"Cognome: "<<dato.cognome<<endl;
                    cout<<"Userrname: "<<dato.username<<endl;
                    cout<<"Password: "<<dato.password<<endl;
                }
                pos++;
            }
           // fclose(f);
        }
        else
            cout<<"\nErrore!";
    
        cout<<"Selezionare l'utente da eliminare: ";
        cin>>del_user;
    
        if(del_user>0 && del_user<pos)
        {
            fseek(f, (del_user-1)*sizeof(User), SEEK_SET);
            fread(&dato, sizeof(User), 1, f);
            dato.elimina = true;
            fseek(f, (del_user-1)*sizeof(User), SEEK_SET);
            fwrite(&dato, sizeof(User), 1, f);
        }
        else
            cout<<"\nUtente Inesistente!";
        fclose(f);
    
        int x = 0, y = 0;
        f = fopen(directory, "rb");
        update = fopen("update_users.dat", "wb");
    
        while(!feof(f))
        {
            fseek(f, x*sizeof(User), SEEK_SET);
            fread(&dato, sizeof(User), 1, f);
    
            if(dato.elimina == false && !feof(f))
            {
                fseek(update, y*sizeof(User), SEEK_SET);
                fwrite(&dato, sizeof(User), 1, update);
                x++;
                y++;
            }
            else if(dato.elimina == true && !feof(f))
            {
            	x++;
            	cout<<"\nUtente Eliminato!";
            }
        }
        fclose(f);
        fclose(update);
    
        remove(directory);
        rename("update_users.dat", directory);
    
        getch();
    }
Devi accedere o registrarti per scrivere nel forum
3 risposte