PDA

View Full Version : [C] Funzioni fread e fwrite


nesly
04-10-2007, 17:25
Per scrivere e leggere su file solitamente uso fscanf e fprintf ma avendo necessità di effettuare ricerche sul programma che devo fare mi trovo costretto ad utilizzare fread e fwrite.

f=fopen("database.txt","a");
printf("Inserisci il nome: ");
gets(nome); getchar();
fwrite(nome,1,sizeof(nome),f);
printf("\nInserisci il cognome: ");
gets(cognome); getchar();
fwrite(cognome,1,sizeof(cognome),f);
printf("\nInserisci data di nascita: ");
gets(datanascita); getchar();

fclose(f);

Il file mi viene creato correttamente ma quando vado a leggere con fread non mi restituisce niente il programma oppure mi restituisce schifezze.

Per esempio se volessi stampare solo nome farei così:

f=fopen("database.txt","r");


fread(nome,1,sizeof(nome),f);
puts(nome);

fclose(f);

Dove sbaglio?

Grazie

telluccio
04-10-2007, 22:37
ciao nesly spero di esserti d aiuto:
sicuramente non l hai trascritto dovresti dichiarare f come struttura(tipo) FILE *f;
dovresti controllare fopen per capire se e tutto ok,
if(fopen("database.txt","a"))printf("fopen restituisce NULL..sbagli qualcosa"):
ciao.

Ziosilvio
05-10-2007, 10:34
Per scrivere e leggere su file solitamente uso fscanf e fprintf ma avendo necessità di effettuare ricerche sul programma che devo fare mi trovo costretto ad utilizzare fread e fwrite.

f=fopen("database.txt","a");
Usa il tag "code" quando scrivi linee di codice. Così:
printf("Inserisci il nome: ");
gets(nome); getchar();
gets non è una funzione sicura: usa fgets.
Oltretutto: non vorrei sbagliare, ma hai allocato spazio per la stringa nome prima di chiamare gets?
fwrite(nome,1,sizeof(nome),f);
Se nome è un puntatore a char, la sua sizeof è quella di un puntatore qualsiasi.
Se vuoi la lunghezza di una stringa, non devi usare sizeof ma strlen.

Se invece nome è un array di char, allora la sua lunghezza come array non è sizeof(nome), ma sizeof(nome)/sizeof(nome[0]).
Fa' attenzione, perché questo trucco funziona solo con gli array statici.