PDA

View Full Version : [C] - programma registrazione utente


software-bloat
12-05-2009, 14:18
ciao a tutti ^^
sto facendo un programma dove dò la possibilità all'utente di registrarsi o accedere.
per ora ho buttato giù queste righe,ma la funziona accedi non va:stordita:
#include <stdio.h>
#include <stdlib.h>

void accedi();
void registrati();

int main()
{
char scelta;

while (1) {
printf("Scegli una delle seguenti opzioni\n");
printf("[1] - Accedi\n");
printf("[2] - Registrati\n");
printf("[3] - Esci\n");


scanf("%c", &scelta);
while(getchar() != '\n');

switch (scelta){
case '1':
accedi();
exit(0);
case '2':
registrati();
exit(0);
case '3':
exit(0);
default:
printf("\aOPZIONE NON VALIDA\n");
}
}

return 0;
}

void accedi()
{
FILE * fp;
char username[20],password[20],Cuser[20],Cpass[20],str[50];

printf("USERNAME: ");
gets(username);
printf("PASSWORD: ");
gets(password);

while(!feof(fp)){
fscanf(fp,"%s %s",Cuser,Cpass);
if((strcmp(Cuser,username)==0) && (strcmp(Cpass,password)==0)){
printf("BENVENUTO %s",Cuser);

}

else{
printf("\aERRORE,UTENTE NON REGISTRATO");
main();
}
}

}

void registrati()
{
char username[20];
char password[20];
FILE * fp;

fp = fopen("db_utenti.txt", "a");

printf("USERNAME: ");
gets(username);
fputs(username,fp);

fputs(" ",fp);

printf("PASSWORD: ");
gets(password);
fputs(password,fp);

fputs("\n", fp);

}

mi sa che sbaglio qualcosa nel ciclo...

yorkeiser
12-05-2009, 14:38
Nella funzione accedi() ti sei dimenticato di aprire il file:

fp = fopen("db_utenti.txt", "r");

Inoltre nel while, dopo che hai trovato l'utente, dovresti aggiungere un

break;

altrimenti il programma continua a leggere utenze dal file di testo e ritornarti messaggi di "non registrato".
Inoltre è buona norma chiudere il puntatore al file, con una fclose, dopo averlo utilizzato.

software-bloat
12-05-2009, 14:40
che imbecille che sono....non so perchè non ho aperto il canale...xD
invece del break; avevo messo exit(0),va bene lo stesso?

yorkeiser
12-05-2009, 14:57
Dove li hai messi tu vanno pure bene (dipende: se vuoi terminare l'esecuzione del programma dopo la stampa del messaggio, vanno bene), ma devi comunque forzare l'uscita nel while di accedi() (appunto con un "break;"), subito dopo la printf di benvenuto.

software-bloat
12-05-2009, 14:58
ok ho fatto ma non funziona...da sempre errore,funziona solo se inserisci i dati del primo utente della lista:mc:

yorkeiser
12-05-2009, 15:24
Non funziona perchè è sbagliata la gestione della stampa dei messaggi nel while e la chiamata al main() nell'else: praticamente, appena vai nel ramo else, richiami il main uscendo quindi dal while, anche se non sei a fine file.
Ti incollo una possibile versione, che tra l'altro utilizza un flag (trovato) al posto del break, che personalmente odio come la morte.

int trovato=0;
while(!feof(fp) && !trovato)
{
fscanf(fp,"%s %s\n",Cuser,Cpass);
if((strcmp(Cuser,username)==0) && (strcmp(Cpass,password)==0))
{
trovato=1;
}


}

if (trovato)
printf("BENVENUTO %s",Cuser);
else
{
printf("\aERRORE,UTENTE NON REGISTRATO");
main();
}

software-bloat
12-05-2009, 15:28
grazie,così sembra funzionare,se avrò altri problemi scriverò qui ^^

PS: perchè lo odi?