PDA

Visualizza la versione completa : [C] Struct mi salta il primo input


goatboy
31-08-2011, 12:20
Salve a tutti, stamattina ho provato a creare un semplicissimo database che mi permetteva di inserire i dati di un utente su un file di testo. Funzionava tutto perfettamente, cos ho pensato di ampliare le funzioni del database inserendo le opzioni Modifica Utente, Elimina Utente e Cerca Utente (che devo ancora capire come si fa), cos ho inserito il menu delle opzioni. Il problema che quando inserisco l'opzione 1 per l'Aggiunta di un Utente (che prima funzionava), mi appare la schermata di aggiunta, ma passa direttamente al secondo valore di input (ovvero il cognome), e non capisco perch. Qualcuno sa aiutarmi?
Questo il codice. So che magari per ogni opzioni dovrei creare una funzione a parte, ma ho un p di difficolt e quindi ho preferito fare un classico menu con if-else if. Sottolineo che prima di aggiungere il menu, funzionava tutto perfettamente.



#include <stdio.h>
#include <stdlib.h>
#define userfile "users.txt"

typedef struct{
char nome[30];
char cognome[30];
char citta[30];
char provincia[30];
int eta;
} user;

int main(void){
FILE *fp;
user u;
int scelta;
if(!(fp=fopen(userfile, "a"))){
printf("Errore.\n");
exit(1);
}
printf("Database.\n\nInserisci il numero relativo all'operazione che vuoi effettuare:\n");
printf("1 - Inserisci Utente\n");
printf("2 - Modifica Utente\n");
printf("3 - Cerca Utente\n");
printf("4 - Elimina Utente\n");
printf("5 - Esci\n");
scanf("%d", &scelta);
if (scelta==1){
printf("Inserimento utente nel database.\n\n");
puts("Nome:");
fgets(u.nome, 30, stdin);
fflush(stdin);
puts("\nCognome:");
fgets(u.cognome, 30, stdin);
fflush(stdin);
puts("\nCitta':");
fgets(u.citta, 30, stdin);
fflush(stdin);
puts("\nProvincia:");
fgets(u.provincia, 30, stdin);
fflush(stdin);
printf("\nEta':\n");
scanf("%d", &u.eta);
// Scrivo i dati su file
fprintf(fp, "Nome: %sCognome: %sCitta': %sProvincia: %sEta': %d\n\n", u.nome, u.cognome, u.citta, u.provincia, u.eta);
printf("\n\nDati inseriti con successo.\n");
fclose(fp);
system("cls");
main();
} else if (scelta==5){
return(0);
}
}

ESSE-EFFE
31-08-2011, 13:17
Originariamente inviato da goatboy
Il problema che quando inserisco l'opzione 1 per l'Aggiunta di un Utente (che prima funzionava), mi appare la schermata di aggiunta, ma passa direttamente al secondo valore di input (ovvero il cognome), e non capisco perch.

E' solo un problema di buffer della tastiera. Dopo la scanf che legge la scelta, aggiungi la seguente istruzione:

fflush(stdin);

e dovrebbe sistemare la cosa.

goatboy
31-08-2011, 13:29
Originariamente inviato da ESSE-EFFE
E' solo un problema di buffer della tastiera. Dopo la scanf che legge la scelta, aggiungi la seguente istruzione:

fflush(stdin);

e dovrebbe sistemare la cosa.
Ma caspiterina, l'ho fatto per tutte le altre, e ho dimenticato di metterla dopo la scanf, che sbadato :dh:

Per caso sapresti aiutarmi per l'opzione Cerca Utente. Vorrei poter inserire il nome da cercare in input e che mi uscissero tutti i risultati di quel nome (uno o pi risultati, a seconda di quanti ce ne sono ovviamente). C' una funzione apposita?

ESSE-EFFE
31-08-2011, 13:51
Originariamente inviato da goatboy
Per caso sapresti aiutarmi per l'opzione Cerca Utente. Vorrei poter inserire il nome da cercare in input e che mi uscissero tutti i risultati di quel nome (uno o pi risultati, a seconda di quanti ce ne sono ovviamente). C' una funzione apposita?

La funzione di ricerca mi pare l'ultimo dei problemi. Prima di tutto non mi pare tu stia gestendo correttamente l'input/output su file: una volta riavviato il programma come li leggi i dati? Metti un'opzione per la visualizzazione di tutti gli utenti per rendertene conto.

E poi quella chiamata a main() dentro il main bruttissima. Pensa a come farne a meno, ti basta un while.

goatboy
31-08-2011, 13:55
Originariamente inviato da ESSE-EFFE
La funzione di ricerca mi pare l'ultimo dei problemi. Prima di tutto non mi pare tu stia gestendo correttamente l'input/output su file: una volta riavviato il programma come li leggi i dati? Metti un'opzione per la visualizzazione di tutti gli utenti per rendertene conto.

Qualche consiglio? Ho fatto in quel modo perch l'unico modo in cui so farlo, ma so che non il migliore dei modi, ma se posso vorrei capire dove e perch sbaglio.. :dh:

ESSE-EFFE
31-08-2011, 14:12
Originariamente inviato da goatboy
Qualche consiglio? Ho fatto in quel modo perch l'unico modo in cui so farlo, ma so che non il migliore dei modi, ma se posso vorrei capire dove e perch sbaglio.. :dh:
Te l'ho gi dato il consiglio: devi pensare a come rileggere i dati dal file che scrivi. Se provi a scrivere la altre funzioni del men (modifica, elimina, ecc.) ti rendi subito conto di ci che manca. E vedrai anche che, cos come li stai scrivendo ora, i dati non sono semplici da rileggere.

goatboy
31-08-2011, 14:16
Originariamente inviato da ESSE-EFFE
Te l'ho gi dato il consiglio: devi pensare a come rileggere i dati dal file che scrivi. Se provi a scrivere la altre funzioni del men (modifica, elimina, ecc.) ti rendi subito conto di ci che manca. E vedrai anche che, cos come li stai scrivendo ora, i dati non sono semplici da rileggere.
Okay, ora provo a cambiare qualcosa, credo di aver capito a cosa ti riferisci.

goatboy
31-08-2011, 17:36
Ok ho modificato il programma. Riesco a visualizzare tutti gli utenti. Ho cambiato il modo in cui venivano scritti i dati sul file, e ho usato la fgets al posto della fscanf perch dava il classico problema delle stringhe con uno spazio (nel caso per esempio di un cognome di due parole). Il problema che non so come fare a cercare una determinata stringa all'interno di un file. Se voglio cercare un nome, come faccio a dire al programma di cercarla? Ho trovato su internet il comando strcmp, ma con gli esempi che c'erano non ho capito bene come applicarla.. Qualcuno sa darmi una mano?



#include <stdio.h>
#include <stdlib.h>
#define userfile "users.txt"

typedef struct{
char nome[30];
char cognome[30];
char citta[30];
char provincia[30];
int eta;
} user;

int main(void){
FILE *fp;
user u;
int scelta;
if(!(fp=fopen(userfile, "a"))){
printf("Errore.\n");
exit(1);
}
printf("Database.\n\nInserisci il numero relativo all'operazione che vuoi effettuare:\n");
printf("1 - Inserisci Utente\n");
printf("2 - Modifica Utente\n");
printf("3 - Cerca Utente\n");
printf("4 - Elimina Utente\n");
printf("5 - Esci\n\n");
scanf("%d", &scelta);
fflush(stdin);
if (scelta==1){
system("cls");
printf("Inserimento utente nel database.\n\n");
puts("Nome:");
fgets(u.nome, 30, stdin);
fflush(stdin);
puts("\nCognome:");
fgets(u.cognome, 30, stdin);
fflush(stdin);
puts("\nCitta':");
fgets(u.citta, 30, stdin);
fflush(stdin);
puts("\nProvincia:");
fgets(u.provincia, 30, stdin);
fflush(stdin);
printf("\nEta':\n");
scanf("%d", &u.eta);
// Scrivo i dati su file
fprintf(fp, "%s%s%s%s%d\n\n", u.nome, u.cognome, u.citta, u.provincia, u.eta);
printf("\n\nDati inseriti con successo.\n");
fclose(fp);
system("cls");
main();
} else if (scelta==3){
system("cls");
fp=fopen(userfile, "r");
if(fp){
while(!feof(fp)){
fgets(u.nome, 30, fp);
fgets(u.cognome, 30, fp);
fgets(u.citta, 30, fp);
fgets(u.provincia, 30, fp);
fscanf(fp, "%d\n", &u.eta);
printf("Nome: %sCognome: %sCitta': %sProvincia: %sEta': %d\n\n", u.nome, u.cognome, u.citta, u.provincia, u.eta);
}
fclose(fp);
system("PAUSE");
} else {
printf("Errore durante l'apertura del file.\n");
}
}
}

Loading