Oppure

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

#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
23/12/11 14:22
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
struct contact {
   char nome[MAX];
   char cognome[MAX];
   char numero[MAX];
   char indirizzo[MAX];
}Contatto;

// poi quando ti serve una var di tipo struct conatct fai
Contatto c;
// o un array
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.
aaa
23/12/11 14:49
HeDo
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 :)

aaa
24/12/11 20:25
Driverfury
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... :(
aaa
24/12/11 20:32
Driverfury
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
struct contact {
   char nome[MAX];
   char cognome[MAX];
   char numero[MAX];
   char indirizzo[MAX];
}Contatto;

// poi quando ti serve una var di tipo struct conatct fai
Contatto c;
// o un array
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:

struct contact
{	
	char name[MAX_STRING]; // Nome
	char surname[MAX_STRING]; // Cognome
	char number[MAX_NUMBER]; // Numero
	char address[MAX_ADDRESS]; // Indirizzo
};


Però c'è un errore di compilazione: "variable-size type declared outside of any function". Premetto che le costanti (globali) le dichiaro prima della struttura.
aaa
25/12/11 9:06
Bonny
fai dei #define
aaa
25/12/11 11:39
Driverfury
Già ho provato con i #define ma è sempre errore...
aaa