Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Aggiugere un contatto nella rubrica
Forum - C/C++ - Aggiugere un contatto nella rubrica

Avatar
Driverfury (Normal User)
Rookie


Messaggi: 45
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 12:06
Venerdì, 23/12/2011
Ciao a tutti, mi sto ricimentando nella creazione di una rubrica in C, ovviamente senza guardare guide o tutorial.

Siccome una rubrica in formato di testo non andava bene a causa della gestione delle stringhe, sto provando con un file binario. Ecco le funzioni che aggiungono e leggono i contatti dalla rubrica (in binario).

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define TRUE 1
  6. #define FALSE 0
  7.  
  8. // Costanti Globali
  9. const int MAX_STRING = 30; // Massimi caratteri del nome e del cognome
  10. const int MAX_NUMBER = 15; // Massimi caratteri per il numero di telefono
  11. const int MAX_ADDRESS = 100; // Massimi caratteri per l'indirizzo
  12. const int MAX_CONTACT = 500; // Numero di contatti massimi nella rubrica
  13.  
  14. // Funzione per aggiungere un contatto nella rubrica
  15. int addContact(char *fileName)
  16. {
  17.         FILE *fp; // Puntatore a file
  18.         struct contact c; // Struttura contatto
  19.        
  20.         if(!(fp=fopen(fileName, "a"))) // Se non riesce ad aprire il file
  21.         {
  22.                 printf("\nErrore nell'apertura del file \"%s\" in modalita' append.\n", fileName);
  23.                 return FALSE; // Ritorna FALSE
  24.         }
  25.        
  26.         fflush(stdin); // Pulisco il buffer dello stdin
  27.                
  28.         c.name = (char *) malloc(MAX_STRING*sizeof(char)); // Alloco dinamicamente il nome
  29.         printf("\nInserisci il nome del contatto: ");
  30.         c.name = fgets(c.name, MAX_STRING+1, stdin); // Prendo in input il nome
  31.        
  32.         c.surname = (char *) malloc(MAX_STRING*sizeof(char)); // Alloco dinamicamente il cognome
  33.         printf("Inserisci il cognome: ");
  34.         c.surname = fgets(c.surname, MAX_STRING+1, stdin);
  35.        
  36.         c.number = (char *) malloc(MAX_NUMBER*sizeof(char)); // Alloco dinamicamente il numero
  37.         printf("Inserisci il numero: ");
  38.         c.number = fgets(c.number, MAX_NUMBER+1, stdin);
  39.        
  40.         c.address = (char *) malloc(MAX_ADDRESS*sizeof(char)); // Alloco dinamicamente l'indirizzo
  41.         printf("Inserisci l'indirizzo (max. 100 caratteri): ");
  42.         c.address = fgets(c.address, MAX_ADDRESS+1, stdin); // Prendo in input l'indirizzo
  43.        
  44.         // Se riesce a scrivere su file più di 0 Byte
  45.         if(fwrite(&c, sizeof(c), 1, fp)>0)
  46.         {
  47.                 printf("\nContatto inserito con successo.\n");
  48.         }
  49.        
  50.         fclose(fp); // Chiudo il file
  51.        
  52.         // Libero la memoria allocata dinamicamente
  53.         free(c.name);
  54.         free(c.surname);
  55.         free(c.number);
  56.         free(c.address);
  57.        
  58.         return TRUE; // Ritorna TRUE se va a buon fine
  59. }
  60.  
  61. // Funzione che mostra a schermo i contatti presenti nella rubrica
  62. int showContacts(char *fileName)
  63. {
  64.         FILE *fp; // Puntatore a file
  65.         struct contact *cts; // Puntatore a struttura contatto
  66.        
  67.         int i=0; // Contatore
  68.        
  69.         if(!(fp=fopen(fileName, "r"))) // Se non riesce ad aprire il file
  70.         {
  71.                 printf("\nErrore nell'apertura del file \"%s\" in modalita' lettura.\n", fileName);
  72.                 return FALSE; // Ritorna FALSE
  73.         }
  74.        
  75.         cts = (struct contact *) malloc((MAX_CONTACT+1)*sizeof(struct contact)); // Alloco dinamicamente
  76.        
  77.         while(fread(&cts[i], sizeof(cts[i]), 1, fp) > 0)
  78.         {
  79.                 printf("\nNome: %s\nCognome: %s\nNumero: %s\nIndirizzo: %s\n", cts[i].name, cts[i].surname, cts[i].number, cts[i].address);
  80.                 i++; // incremento il contatore
  81.         }
  82.        
  83.         free(cts); // Libero la memoria allocata dinamicamente
  84.         fclose(fp); // Chiudo il file
  85.        
  86.         return TRUE; // Ritorna TRUE se tutto va a buon fine
  87. }



Quando scrivo un contatto su file stampa a schermo la scritta: "Contatto inserito con successo.". Quando vado a visualizzare i contatti, invece del nome, cognome ecc... che ho inserito, mi esce il valore variabile di sistema Path (uso Windows XP). Potreste aiutarmi?

Ultima modifica effettuata da Driverfury il 23/12/2011 alle 12:08
PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 435
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 15:22
Venerdì, 23/12/2011
é ammirevole che tu programmi senza guardare guide o ecc..
Però uno sguardo ad un manuale C, agli esempio su come manipolare i file e poi i puntatori devi farlo
Vedo un sacco di confusione nel codice per esempio
dichiari una var c di tipo struct contact e poi allochi lo spazio in memoria per i vari campi di essa,
in questo caso dedicato se sai gia che sono campi con una dimensione definita dalle costanti basta fare
Codice sorgente - presumibilmente C++

  1. struct contact {
  2.    char nome[MAX];
  3.    char cognome[MAX];
  4.    char numero[MAX];
  5.    char indirizzo[MAX];
  6. }Contatto;
  7.  
  8. // poi quando ti serve una var di tipo struct conatct fai
  9. Contatto c;
  10. // o un array
  11. Contatto c[N];



tutte quelle malloc che fai nella funzione di inserimento è codice scritto inutilmente dal mio punto di vista.
Nella seconda funzioni comunque dovresti rifare le malloc perchè funzioni(per ogni componente del vettore cts) come hai fatto tu quello è un vettore di puntatori a strutture di tipo contact ma non hai allocato ogni struct contact.


Bonny
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 15:49
Venerdì, 23/12/2011
se sei nato imparato e ti permetti di programmare senza guide perchè sei qui sul forum? se vuoi fare tutto da solo noi non abbiamo nulla da dirci :)



Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
Driverfury (Normal User)
Rookie


Messaggi: 45
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 21:25
Sabato, 24/12/2011
Avete interpretato male quello che ho scritto... anzi ho sbagliato io ad esprimermi: sto facendo una rubrica ma senza seguire alcun tutorial che spieghi come fare una rubrica (che è l'esempio classico di quasi tutte le guide, no?). Chiedo scusa per l'incoveniente... :(

PM Quote
Avatar
Driverfury (Normal User)
Rookie


Messaggi: 45
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 21:32
Sabato, 24/12/2011
Testo quotato

Postato originariamente da Bonny:

é ammirevole che tu programmi senza guardare guide o ecc..
Però uno sguardo ad un manuale C, agli esempio su come manipolare i file e poi i puntatori devi farlo
Vedo un sacco di confusione nel codice per esempio
dichiari una var c di tipo struct contact e poi allochi lo spazio in memoria per i vari campi di essa,
in questo caso dedicato se sai gia che sono campi con una dimensione definita dalle costanti basta fare
Codice sorgente - presumibilmente C++

  1. struct contact {
  2.    char nome[MAX];
  3.    char cognome[MAX];
  4.    char numero[MAX];
  5.    char indirizzo[MAX];
  6. }Contatto;
  7.  
  8. // poi quando ti serve una var di tipo struct conatct fai
  9. Contatto c;
  10. // o un array
  11. Contatto c[N];



tutte quelle malloc che fai nella funzione di inserimento è codice scritto inutilmente dal mio punto di vista.
Nella seconda funzioni comunque dovresti rifare le malloc perchè funzioni(per ogni componente del vettore cts) come hai fatto tu quello è un vettore di puntatori a strutture di tipo contact ma non hai allocato ogni struct contact.



Ho provato a definire già i campi quando definisco la struttura:

Codice sorgente - presumibilmente C++

  1. struct contact
  2. {      
  3.         char name[MAX_STRING]; // Nome
  4.         char surname[MAX_STRING]; // Cognome
  5.         char number[MAX_NUMBER]; // Numero
  6.         char address[MAX_ADDRESS]; // Indirizzo
  7. };



Però c'è un errore di compilazione: "variable-size type declared outside of any function". Premetto che le costanti (globali) le dichiaro prima della struttura.

PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 435
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 10:06
Domenica, 25/12/2011
fai dei #define


Bonny
PM Quote
Avatar
Driverfury (Normal User)
Rookie


Messaggi: 45
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 12:39
Domenica, 25/12/2011
Già ho provato con i #define ma è sempre errore...

PM Quote