PDA

View Full Version : [C] Problema lettura file con fread


cybergabry
04-04-2008, 15:22
Ciao a tutti di nuovo,
vi propongo una nuova questione che non sono proprio riuscito a risolvere.
Il seguente programma legge un file binario di complessi. Il file che ho creato riporta i seguenti dati:
4523.236
4589.325
452.236
4879.69
7854.39
8953.24
246.27
789.56
la prima riga è la parte reale del primo complesso, la seconda è la parte immaginaria del primo complesso, la terza è la parte reale del secondo complesso, la quarta è la parte immaginaria del secondo complesso e così via...
Il programma legge il file, e riporta nella variabile dim il numero di numeri complessi ivi contenuti, così alloca dinamicamente la memoria per un vettore allo scopo di poterli contenere tutti. Il problema è che anche se alloca la quantità corretta di memoria (4 numeri complessi) quando viene mandato in stampa il vettore restituisce tutti zeri. Dove sbaglio? Vi ringrazio sempre tanto per l'aiuto.
#include <stdio.h>
#include <stdlib.h>

typedef struct {
double re, im;
} complesso;

void carica (FILE *fp, complesso *vet, int dim);

int main ()
{
FILE *fp;
complesso *vet, elem;
int dim=0, i;

if ((fp=fopen ("complessi.dat", "rb"))==NULL)
{
perror ("Al tentativo di apertura del file si e' verificato l'errore: ");
return -1;
}
while ((fread (&elem, sizeof(complesso), 1, fp))!=0)
dim++;
printf ("\ndim= %d", dim);
rewind (fp);
vet= (complesso*) malloc (dim*sizeof(complesso));
carica (fp, vet, dim);
for (i=0; i<dim; i++)
printf ("\nRe= %lf Im= %lf", vet[i].re, vet[i].im);
return 0;
}
void carica (FILE *fp, complesso *vet, int dim)
{
int i;

for (i=0; i<dim; i++)
fread (&vet[i], sizeof(complesso), 1, fp);
}

cybergabry
05-04-2008, 13:42
Toc toc, c'è nessuno...??? :( :( :(

andbin
05-04-2008, 14:01
Per i double lo specificatore di formato per le Xprintf è %f non %lf.

cybergabry
05-04-2008, 15:33
Per i double lo specificatore di formato per le Xprintf è %f non %lf.

Ti ringrazio per l'aiuto, ho fatto come hai detto, ho messo %f al posto di %lf, ma l'output rimane sempre lo stesso. Per es, per il file descritto nel primo messaggio ottengo:
dim=4
Re=0.000000 Im=0.000000
Re=0.000000 Im=0.000000
Re=0.000000 Im=0.000000
Re=0.000000 Im=0.000000

T-Jack
05-04-2008, 20:19
Il codice per la lettura sembra a posto.... evidentemente il problema
e nel codice che scrive il file, io ho provato a scrivere complessi.dat
con questo codice e mi ha dato l'output corretto

#include <stdio.h>

int main()
{
FILE *hfile;

hfile = fopen("complessi.dat", "wb");

double vars[] = { 4523.236, 4589.325, 452.236, 4879.69,
7854.39, 8953.24, 246.27, 789.56};

fwrite(&vars, sizeof(double), 8, hfile);

fclose(hfile);

return 0;
}

andbin
05-04-2008, 20:46
ho messo %f al posto di %lf, ma l'output rimane sempre lo stesso.Te l'ho segnalato perché ovviamente è più corretto %f. Ma questo non inficia sul print del valore.
Confermo che il tuo codice sopra è corretto. E quindi presumo che sia "chi scrive" quel file che non fa il suo dovere.

cybergabry
06-04-2008, 15:06
Andbin e T-Jack, vi ringrazio veramente tanto per l'aiuto, vi siete dimostrati molto disponibili. Mi avete tolto questo dubbio in vista dell'esame.