Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408

    [C] Struct mi salta il primo input

    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.

    codice:
    #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);       
        }
    }

  2. #2

    Re: [C] Struct mi salta il primo input

    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.

  3. #3
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408

    Re: Re: [C] Struct mi salta il primo input

    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

    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?

  4. #4

    Re: Re: Re: [C] Struct mi salta il primo input

    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.

  5. #5
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408

    Re: Re: Re: Re: [C] Struct mi salta il primo input

    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..

  6. #6

    Re: Re: Re: Re: Re: [C] Struct mi salta il primo input

    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..
    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.

  7. #7
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408

    Re: Re: Re: Re: Re: Re: [C] Struct mi salta il primo input

    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.

  8. #8
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    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?

    codice:
    #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");       
               }
        }
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.