PDA

View Full Version : Aiuto per esame


giova22
01-07-2004, 12:26
Ciao a tutti

Ho fatto un programmino per l' esame di informatica in c.


E' una rubrica, ma quando vado a compilare ed eseguire il programma tutto ok.

Il problema è che ad esempio se inserisco la persona mario rossi
viene inserita come marioààààààà rosssiàààààààà

Perchè?

Aiuto vi prego tra poco ho l' esame.

Ecco la funzione per inserire il nome

typedef struct {char nome[32]; char cognome[32];char telefono[32];}
contatto;


void ins_contatto()
{
contatto v[1];
FILE *fp;
fp=fopen("rubrica.bin", "a+");
memset(v,0,sizeof(v));

system("cls");
printf("************************************************************\n");
printf("\nHai scelto di inserire un contatto in rubrica");
fseek(fp,0,SEEK_END);
printf("\n\nOra inserici il nome della persona da inserire nella rubrica\n");
printf("\n Nome ----> ");
scanf("%s", v[0].nome);
printf("\n\nbene, ora inserisci il cognome e premi invio\n");
printf("\n cognome ---> ");
scanf("%s", v[0].cognome);
printf("\n\ndigita ora il numero di telefono\n");
printf("\n telefono ---> ");
scanf("%s", v[0].telefono);
fwrite(v, sizeof(contatto), 1, fp);
system("cls");
printf("\ncontatto inserito correttemente\n\n\n");
fclose(fp);
//return;
}





e quella per leggere

void leggi_tutti()
{
contatto v[1];
FILE *fp;
fp=fopen("rubrica.bin", "r");
system("cls");
while((fread(v, sizeof(contatto), 1, fp)!= 0))
{
printf("\n%s ", v[0].nome);
printf("%s ", v[0].cognome);
printf("%s \n", v[0].telefono);
}
//return;
}

bizzu
02-07-2004, 11:16
Non ho capito perché contatto lo hai dichiarato come vettore di un solo elemento. Se hai un solo elemento, basta una variabile...
Inoltre io non inserirei i campi uno alla volta nel file, ma come struttura; se no la struttura a che ti serve? Basterebbe leggere 3 stringhe alla volta...
E poi chiudi il file nella funzione di stampa...

Ed_Bunker
02-07-2004, 20:06
I buffer per memorizzare i campi della struct sono di 32 byte pertanto, a meno che tu non aggiunga esplicitamente un carattere di terminazione ('\0') la printf ti stampa tutti i 32 byte dei quali soltanto una parte sara' significativa. O opti per l'allocazione dinamica dei campi in modo da poter ottimizzare l'utilizzo della memoria e per poter usare nomi e cognomi lunghi a piacere oppure inserisci tu il carattere di terminazione quando fai le scanf.

P.S.: penso che sia questo il problema.

giova22
06-07-2004, 17:12
Mi dici come fare con il carattere di terminazione che non ricordo + ?

kk3z
06-07-2004, 18:08
Originariamente inviato da Ed_Bunker
a meno che tu non aggiunga esplicitamente un carattere di terminazione ('\0')
:)

giova22
12-07-2004, 13:14
up. Allora mi dite come mettere il carattere di terminazione /o?

Dun
12-07-2004, 15:52
Da man scanf -> sezione %s.


Matches a sequence of non-white-space characters; the next
pointer must be a pointer to char, and the array must be large
enough to accept all the sequence and the terminating NUL char-
acter. The input string stops at white space or at the maximum
field width, whichever occurs first.


Non mi apre sia il problema della mancanza di \0 :)

Io intanto correggerei la dichiarazione di contatto. Prova ad evitare di creare un array di grandezza 1; dichiaralo invece come contatto variabile;


Un'altra cosa non mi e' chiara.... memset(v,0,sizeof(v));.

Inutile mi sembra, non capisco veramente la sua funzione in questo contesto....