PDA

Visualizza la versione completa : [C] Gestire e cancellare file di utenti


Ki11aTom
25-05-2012, 21:25
Allora ho questo programma in C con File. Il programma crea 1 file trimestre.bin e da la possibilitā di inserire modificare e cancellare utenti da una struct con vari campi( nome, cognome indirizzo ...) una volta effettuate le modifiche sulla struct deve salvare nel file trimestre.bin e questo lo fa perō ho un problema nella cancellazione di 1 utente a scelta non capisco perchč inserisco 2 utenti e me ne visualizza solo 1 possibile da cancellare una mano!!!
mi direste dove sbaglio?? Grazie in anticipo!!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define MAX 1000
typedef struct {
char nome[21];
char cognome[21];
char fiscale[17];
char indirizzo[50]; // via ...
float cFine_TriAttu; // lettura del contatore alla fine del trimestre attuale (metri cubi)
float cFine_TriPrec; // lettura del contatore alla fine del trimestre precedente (metri cubi)
float boll_Npag; // importo di eventuali bollette precedenti non pagate
} Utente;
int acquisisciStruct(Utente tab[]);
int menu();
int ricerca(Utente *v,int n,char key);
void modifica(Utente t[],int n);
void cancella(Utente u[],int n);
int main() {
int i,i2,z=0,lung3=0,lung;
char nomekey[21];
Utente tab2[MAX],tab3[MAX];
FILE *f;
int scelta,ret,true=1;
do {
scelta=menu();

switch(scelta) {
case 1:
system("cls");
lung=acquisisciStruct(tab2);
printf("\n\n");
system("pause");
system("cls");
break;
case 2:
//cancellazione 1 utente
system("cls");

fflush(stdin);
//ret=ricerca(tab2,lung,nomekey);
cancella(tab2,lung);


fclose(f);
system("pause");
system("cls");
break;
case 3:
system("cls");
f=fopen("Trimestre.bin","w+b");
fclose(f);
printf("File Cancellato\n\n");
system("pause");
system("cls");
break;
case 4:
//pagassetato
system("C:/Users/Tommaso/Desktop/Programma FILE/gestacque/bin/Debug/pagassetato.exe");
system("pause");
system("cls");
break;
case 5:
system("cls");
printf("\n-----Modifica file-----\n");
modifica(tab2,lung);
system("pause");
system("cls");
break;
case 6:
system("cls");
printf("\n (MODIFICHE TERMINATE)Carico File... \n\n\n");
gotoXY(32,4);
printf("|");
gotoXY(1,4);
printf("|");
for(i=0; i<30; i++) {
printf("%c",219);
Sleep(150);
}
if((f=fopen("Trimestre.bin","rb"))==NULL) {
f=fopen("Trimestre.bin","w+b");
} else {
f=fopen("Trimestre.bin","a+b");
}
for(i2=0; i2<lung; i2++) {
fwrite(&tab2[i2],sizeof(Utente),1,f);
}
fclose(f);
printf("\n\n File pronto\n\n");
system("pause");
system("cls");
break;
case 7:
exit(1);
break;
}
} while(1==1);

}
int acquisisciStruct(Utente tab[]) {
int i,lung=0;
char nuovo;
FILE *f;
memset(tab,0,sizeof(Utente)*MAX);
for(i=0; i<MAX; i++) {
lung+=1;
printf("\n\tUTENTE %d",i+1);
fflush(stdin);
printf("\nInserisci nome: ");
gets(tab[i].nome);
fflush(stdin);
printf("\nInserisci cognome: ");
gets(tab[i].cognome);
fflush(stdin);
printf("\nCodice Fiscale: ");
scanf("%s",tab[i].fiscale);
fflush(stdin);
printf("\nIndirizzo: ");
gets(tab[i].indirizzo);
fflush(stdin);
printf("\nContatore fine trimestre attuale? ");
scanf("%f",&tab[i].cFine_TriAttu);
fflush(stdin);
printf("\nContatore fine trimestre precedente? ");
scanf("%f",&tab[i].cFine_TriPrec);
fflush(stdin);
printf("\nBollette precedenti non pagate: ");
scanf("%f",&tab[i].boll_Npag);
fflush(stdin);
system("cls");
printf("\nVuoi inserire un nuovo utente(s/n)?");
scanf("%c",&nuovo);
if(nuovo=='n') return 1;
}
return lung;

}
int menu() {
int n;
do {
printf("\n\t--------MENU--------\n");
printf("\n\t1-Inserisci utenti\n\n");
printf("\t2-Cancellare utente\n\n");
printf("\t3-Cancellare File\n\n");
printf("\t4-Avvia PagaAssetato.exe\n\n");
printf("\t5-Modifica Utente\n\n");
printf("\t6-Salva nel File (ATTENZIONE!! SOLO SE E\' SICURO DI AVERE EFFETTUATO TUTTE LE MODIFICHE!!)\n\n");
printf("\t7-ESCI\n\n");
printf("\n\t scelta: ");
scanf("%d",&n);
} while(n<0 && n>7);
return n;
}
int ricerca(Utente *v,int n,char key) {
int i;
for(i=0; i<n; i++) {
if(strcmp(v[i].cognome,key)==0) {
return i;
}
return -1;
}
}
void modifica(Utente t[],int n) {
int i;
char mod[21];
if(n>0) {
fflush(stdin);
printf("\nInserisci cognome dell\'utente da modificare");
gets(mod);
fflush(stdin);
for(i=0; i<n; i++) {
if(strcmp(t[i].cognome,mod)==0) {
printf("\n\tUTENTE %d",i+1);
fflush(stdin);
printf("\nInserisci nome: ");
gets(t[i].nome);
fflush(stdin);
printf("\nInserisci cognome: ");
gets(t[i].cognome);
fflush(stdin);
printf("\nCodice Fiscale: ");
scanf("%s",t[i].fiscale);
fflush(stdin);
printf("\nIndirizzo: ");
gets(t[i].indirizzo);
fflush(stdin);
printf("\nContatore fine trimestre attuale? ");
scanf("%f",&t[i].cFine_TriAttu);
fflush(stdin);
printf("\nContatore fine trimestre precedente? ");
scanf("%f",&t[i].cFine_TriPrec);
fflush(stdin);
printf("\nBollette precedenti non pagate: ");
scanf("%f",&t[i].boll_Npag);
fflush(stdin);
printf("\n Utente modificato");
} else {
printf("\nUtente Inesistente!!");
}
}
} else printf("\n0 utenti inseriti!!!");
}
void cancella(Utente u[],int n) {
int i,s,risp,rispostautente,k;

do {
printf("\tVuoi eliminare un utente?\n\n\tSi:Premi 1\n\tNo:Premi 2\nRisposta: ");
scanf("%d",&risp);
if(risp==1) {
system("cls");
for(s=0; s<n; s++) {
printf("Utente %d\n",s+1);
printf("%s\n",u[s].nome);
printf("%s\n",u[s].cognome);
printf("%s\n",u[s].fiscale);
printf("%s\n",u[s].indirizzo);
printf("%f\n",u[s].cFine_TriAttu);
printf("%f\n",u[s].cFine_TriPrec);
printf("%f\n",u[s].boll_Npag);
}
do {
printf("Quale utente vuoi eliminare?\nDigita solo il numero:Utente ");
scanf("%d",&rispostautente);
if(rispostautente<=0||rispostautente>s) {
printf("Utente non esistente\n");
}
} while(rispostautente<=0||rispostautente>s);
for(k=rispostautente-1; k<n-1; k++) {
strcpy(u[k].nome,u[k+1].nome);
strcpy(u[k].cognome,u[k+1].cognome);
strcpy(u[k].fiscale,u[k+1].fiscale);
strcpy(u[k].indirizzo,u[k+1].indirizzo);
u[k].cFine_TriAttu=u[k+1].cFine_TriAttu;
u[k].cFine_TriPrec=u[k+1].cFine_TriPrec;
u[k].boll_Npag=u[k+1].boll_Npag;

}

i--;
}
} while(risp==1);

}
void gotoXY(int x, int y) {
COORD CursorPos = {x, y};
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsole, CursorPos);
}

Scara95
25-05-2012, 21:30
E' inutile che tu dica urgente, sarebbe pių utile un titolo che esplichi il problema, comunque cosė il codice č illeggibile e "ho problemi nella cancellazione": quali di preciso?

oregon
25-05-2012, 21:32
Utilizza i tag CODE altrimenti č impossibile rispondere.

P.S. Scrivendo "urgente" peggiori la situazione ...

Ki11aTom
25-05-2012, 21:42
Nella funzione cancella se ho inserito 2 utenti me ne visualizza 1 e me ne rende possibile da cancellare soltanto 1 !!! č questo il problema

Scara95
25-05-2012, 21:57
cancella(tab2,lung);
Magari č sbagliata questa chiamata, anche perchč non si capisce da dove arrivi questo lung, come l'hai inizializzato?

Ki11aTom
25-05-2012, 22:01
int i,lung=0;
char nuovo;
FILE *f;
memset(tab,0,sizeof(Utente)*MAX);
for(i=0; i<MAX; i++) {
lung+=1;
printf("\n\tUTENTE %d",i+1);
fflush(stdin); printf("\nInserisci nome: ");
gets(tab[i].nome);
fflush(stdin); printf("\nInserisci cognome: ");
gets(tab[i].cognome);
fflush(stdin); printf("\nCodice Fiscale: ");
scanf("%s",tab[i].fiscale);
fflush(stdin);
printf("\nIndirizzo: ");
gets(tab[i].indirizzo);
fflush(stdin);
printf("\nContatore fine trimestre attuale? ");
scanf("%f",&tab[i].cFine_TriAttu);
fflush(stdin);
printf("\nContatore fine trimestre precedente? ");
scanf("%f",&tab[i].cFine_TriPrec);
fflush(stdin);
printf("\nBollette precedenti non pagate: ");
scanf("%f",&tab[i].boll_Npag); fflush(stdin); system("cls");
printf("\nVuoi inserire un nuovo utente(s/n)?");
scanf("%c",&nuovo);
if(nuovo=='n') return 1;
} return lung;

lung č inizializzato qui e dovrebbe contare il numero di utenti inseriti se non ho sbagliato nulla cioč ogni volta chiede se si vuole inserirne uno nuovo ... se no fa break; e torna al menų

oregon
25-05-2012, 22:11
Originariamente inviato da Ki11aTom
se no fa break; e torna al menų

break ? Quale break ? Io vedo

if(nuovo=='n') return 1;

ovvero restituisce sempre 1

Quindi vedrai sempre e solo un utente.

Ki11aTom
25-05-2012, 22:13
ah č vero č return 1 ho sbagliato ma cambiando dovrebbe funzionare??

Ki11aTom
25-05-2012, 22:24
Risolto funziona ora, era il return 1 che mandava in tilt tutto, apposto grazie per l'aiuto mi scuso su come ho postato il codice ma sono nuovo e non l'avevo mai fatto Grazie ancora :D

oregon
25-05-2012, 22:24
Cambiandolo in modo corretto, sė.

Loading