23/12/11 11:06
Driverfury
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).
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?
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).
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TRUE 1 #define FALSE 0 // Costanti Globali const int MAX_STRING = 30; // Massimi caratteri del nome e del cognome const int MAX_NUMBER = 15; // Massimi caratteri per il numero di telefono const int MAX_ADDRESS = 100; // Massimi caratteri per l'indirizzo const int MAX_CONTACT = 500; // Numero di contatti massimi nella rubrica // Funzione per aggiungere un contatto nella rubrica int addContact(char *fileName) { FILE *fp; // Puntatore a file struct contact c; // Struttura contatto if(!(fp=fopen(fileName, "a"))) // Se non riesce ad aprire il file { printf("\nErrore nell'apertura del file \"%s\" in modalita' append.\n", fileName); return FALSE; // Ritorna FALSE } fflush(stdin); // Pulisco il buffer dello stdin c.name = (char *) malloc(MAX_STRING*sizeof(char)); // Alloco dinamicamente il nome printf("\nInserisci il nome del contatto: "); c.name = fgets(c.name, MAX_STRING+1, stdin); // Prendo in input il nome c.surname = (char *) malloc(MAX_STRING*sizeof(char)); // Alloco dinamicamente il cognome printf("Inserisci il cognome: "); c.surname = fgets(c.surname, MAX_STRING+1, stdin); c.number = (char *) malloc(MAX_NUMBER*sizeof(char)); // Alloco dinamicamente il numero printf("Inserisci il numero: "); c.number = fgets(c.number, MAX_NUMBER+1, stdin); c.address = (char *) malloc(MAX_ADDRESS*sizeof(char)); // Alloco dinamicamente l'indirizzo printf("Inserisci l'indirizzo (max. 100 caratteri): "); c.address = fgets(c.address, MAX_ADDRESS+1, stdin); // Prendo in input l'indirizzo // Se riesce a scrivere su file più di 0 Byte if(fwrite(&c, sizeof(c), 1, fp)>0) { printf("\nContatto inserito con successo.\n"); } fclose(fp); // Chiudo il file // Libero la memoria allocata dinamicamente free(c.name); free(c.surname); free(c.number); free(c.address); return TRUE; // Ritorna TRUE se va a buon fine } // Funzione che mostra a schermo i contatti presenti nella rubrica int showContacts(char *fileName) { FILE *fp; // Puntatore a file struct contact *cts; // Puntatore a struttura contatto int i=0; // Contatore if(!(fp=fopen(fileName, "r"))) // Se non riesce ad aprire il file { printf("\nErrore nell'apertura del file \"%s\" in modalita' lettura.\n", fileName); return FALSE; // Ritorna FALSE } cts = (struct contact *) malloc((MAX_CONTACT+1)*sizeof(struct contact)); // Alloco dinamicamente while(fread(&cts[i], sizeof(cts[i]), 1, fp) > 0) { printf("\nNome: %s\nCognome: %s\nNumero: %s\nIndirizzo: %s\n", cts[i].name, cts[i].surname, cts[i].number, cts[i].address); i++; // incremento il contatore } free(cts); // Libero la memoria allocata dinamicamente fclose(fp); // Chiudo il file return TRUE; // Ritorna TRUE se tutto va a buon fine }
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 23/12/11 11:08
aaa