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();
}