[c] rubrica elettronica - leggere contatti salvati

di il
8 risposte

[c] rubrica elettronica - leggere contatti salvati

Per imparare il linguaggio volevo sviluppare una rubrica elettronica che permettesse di:
1) aggiungere un contatto (ovviamente!);
2) leggere tutti i contatti salvati;
3) cercare un contatto ben preciso.

Finora ho scritto questo:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main () {
    char nome [50], numero [20], ricerca_nome[100], ricerca_numero[100];
    int i, scelta, cont;
    
    do {
        puts ("#### RUBRICA ELETTRONICA ####");
        puts ("1) inserisci nuovo contatto");
        puts ("2) cerca un contatto");
        puts ("3) visualizza tutti i contatti");
        puts ("4) clear");
        puts ("0) esci");
        scanf ("%d", &scelta);

        switch (scelta)
        {
        case 0:
            break;
        case 1:
            printf ("\nAGGIUNGI CONTATTO\n");
            printf ("Inserisci il nome:  ");
            scanf ("%s", nome);
            
            printf ("\nInserisci il numero:  ");
            scanf ("%s", numero);
             
            
            for (i = 0; nome[i]; i++) {
            nome[i] = toupper (nome[i]); }

            FILE *f;
            f = fopen ("/home/vincenzo/Documenti/rubrica/rubrica.txt", "a");
            fprintf (f, "%s", nome);
            fprintf (f, "\t");
            fprintf (f, "%s", numero);
            fprintf (f, "\n");
            fflush(f);
            fclose (f);
            break;
    
        case 2:
            f = fopen ("/home/vincenzo/Documenti/rubrica/rubrica.txt", "r");

            do {
                ricerca_nome[100] = 'null';
                fscanf (f, "\n");
                fscanf (f, "%s %s", ricerca_nome, ricerca_numero);
                if (strcmp("null", ricerca_nome) == 0)
                    break;
                else
                    printf ("%s %s\n", ricerca_nome, ricerca_numero);
            } while (strcmp("null", ricerca_nome) == 0);


        case 3:
            


        case 4:
            system ("clear");
            break;

        default: printf ("Errore\n");
            exit(0);
        }
        
        } while (scelta != 0);

        exit(0);

 }
va tutto bene, tranne al punto 2. Ho provato a inserire quel codice ma non va, o meglio mi legge solo la prima riga del file e non gli altri. Come devo fare per fargli leggere tutti i contatti?

8 Risposte

  • Re: [c] rubrica elettronica - leggere contatti salvati

    Cosa dovrebbe fare questa riga?
    
    ricerca_nome[100] = 'null';
    
  • Re: [c] rubrica elettronica - leggere contatti salvati

    Inizzazione della variabile: assume il valore "null". Alla fine se è ancora "null" vuol dire che non ci sono più nomi nel file e quindi deve finire il ciclo. Ma ho solo provato a fare, non ho proprio idea di come possa andare. Non guardare il codice che ho messo a case 2 e 3. La mia domanda è: avendo i contatti salvati in un file, con struttura "%s %s", nome, numero, come posso far stampare a schermo tutti i contatti salvati?
  • Re: [c] rubrica elettronica - leggere contatti salvati

    Inizia a mettere a posto ciò che non è corretto prima.
    ricerca_nome è una stringa tu li stai assegnando dio sa cosa. 'null' non so cos'è in quanto l'hai chiusa tra apici. Se vuoi inizializzare una stringa devi usare strcpy e non come stai faccendo.
  • Re: [c] rubrica elettronica - leggere contatti salvati

    Altrimenti c'è un comando preciso per dire che quando sono finite le righe nel file deve uscire dal ciclo?
  • Re: [c] rubrica elettronica - leggere contatti salvati

    Il file va in EOF se sei arrivato alla fine.
    http://www.cplusplus.com/reference/clibrary/cstdio/feof/
  • Re: [c] rubrica elettronica - leggere contatti salvati

    Sto correggendo. Ma se io volessi stampare "Premere un tasto per continuare.", dopo il printf cosa devo mettere? Perchè dopo cancella lo schermo quindi si deve avere il tempo di leggere quello stampato in precedenza.
    
    printf ("Contatto aggiunto. Premere un tasto per continuare.\n");
    =>??<=
    system ("clear");            
    break;
  • Re: [c] rubrica elettronica - leggere contatti salvati

    Getch(), oppure quello che non consiglio ma vedo che è usato molto: system("pause");
  • Re: [c] rubrica elettronica - leggere contatti salvati

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    int main () {
        FILE *f;
        char nome [50], numero [20], ch[10];
        int i, scelta, canc;
        
        
        do {
            puts ("#### RUBRICA ELETTRONICA ####");
            puts("  per O.S. Linux - vers. 0.1 - by V. @@@@");
            puts ("");
            puts ("1) Inserisci nuovo contatto");
            puts ("2) Visualizza tutti i contatti");
            puts ("3) Cancella intera rubrica");
            puts ("0) Esci");
            scanf ("%d", &scelta);
    
            switch (scelta)
            {
            case 0:
                break;
            case 1:
                system ("clear");
                printf ("AGGIUNGI CONTATTO\n");
                printf ("Inserisci il nome:  ");
                scanf ("%s", nome);
                
                printf ("\nInserisci il numero:  ");
                scanf ("%s", numero);
                 
                
                for (i = 0; nome[i]; i++) {
                nome[i] = toupper (nome[i]); }
          
                f = fopen ("/home/vincenzo/Documenti/rubrica/rubrica.txt", "a");
                fprintf (f, "%s", nome);
                fprintf (f, "\t");
                fprintf (f, "%s", numero);
                fprintf (f, "\n");
                fflush(f);
                fclose (f);
                printf ("Contatto aggiunto.\n\n");
                printf ("Premere 1 per continuare. ");
                scanf ("%s", ch);
                system ("clear");
                break;
                 
        
            case 2:
    
                system ("clear");
                f = fopen ("/home/vincenzo/Documenti/rubrica/rubrica.txt", "r");
    
                if (f==NULL) printf ("Impossibile aprire il file.\n\n");
                else {
                    while (!feof(f)) {
                        fscanf (f, "%s %s", nome, numero);
                        printf ("%s\n\t%s\n\n", nome, numero);
                     }
                }
                printf ("\nPremere 1 per tornare al menu.\n");
                scanf ("%s", ch);
                system ("clear");
                break;
    
            case 3:
                system ("clear");
                canc = 0;
                printf ("Sei sicuro di voler cancellare i contatti salvati? 1 Si 2 No\n");
                scanf ("%d", &canc);
                switch (canc)
                {
                    case 1:
                        remove ("/home/vincenzo/Documenti/rubrica/rubrica.txt");
                        printf ("\nRubrica cancellata. Premere un tasto qualsiasi per continuare.\n");
                        scanf ("%s", ch);
                        system ("clear");
                        break;
                }
                break;
             
            default: printf ("Errore\n");
                break;
            }
            
            } while (scelta != 0);
    
            exit(0);
    
     }
    
    Questo è il codice sorgente. Sotto linux gira tutto alla perfezione. Ho provato a esportarlo in windows, cambiando system ("clear") con system ("cls") e cambiando l'indirizzo del file. Parte però si blocca a fopen. Perchè?
Devi accedere o registrarti per scrivere nel forum
8 risposte