PDA

View Full Version : [C] Lettura floats.


Unrue
08-05-2008, 15:49
Ciao ragazzi,
ho un dubbio banale sulla fscanf. Ho scritto due colonne di valori floats in un file con "%8.2f %8.2f".
Rileggendoli allo stesso modo, mi va in sigfault. Se invece alla fscanf metto "%f %f" funziona tutto a dovere.

#define PI 3.14159265358979

#include <stdio.h>
#include <math.h>
#include <stdlib.h>


int main(int argc, char *argv[])
{
FILE *fp;
int punti,i,j;
float dominio[2];
float nuovo_punto, valore;
float point[200], value[200];
dominio[0]=0.0;
dominio[1]=PI;
fp=fopen("dati","r");
if(fp==NULL){
printf("Errore: impossibile aprire il file\n");
return 1;
}else{
i=0;
while(fscanf(fp,"%8.2f %8.2f",&nuovo_punto,&valore)!=EOF){
printf("%8.2f %8.2f\n",nuovo_punto,valore);
point[i]=nuovo_punto;
value[i]=valore;
i++;
}
fclose(fp);
fp=fopen("dati","w");
for(j=0;j<i;j++){
fprintf(fp,"%8.2f %8.2f\n",point[j]+PI,value[j]);
}
fclose(fp);
}



return 0;
}


Se scrivo e leggo allo stesso modo come mai non va? Grazie.

DanieleC88
08-05-2008, 17:50
Perché fscanf() non ha bisogno di sapere la precisione del numero in virgola mobile che hai impostato, che invece serve a fprintf() per troncarlo o estenderlo durante la formattazione: provandolo a compilare con gcc qui mi avverte, con %8.2f, che sto passando un formato non valido, e mi dà questo warning:
warning: unknown conversion type character '.' in format

Quindi qualche piccolo consiglio:
compila sempre con le opzioni -W -Wall: ti darà un po' più di rotture all'inizio, ma ti evita parecchi mal di testa poi.
puoi migliorare la leggibilità del codice evitando il blocco else dopo il controllo su fp==NULL: nel blocco if hai un return, quindi se la condizione è soddisfatta il codice non continuerà l'esecuzione; in caso contrario, continuerà a fare il suo lavoro, per cui togliere l'else non modificherà il comportamento del programma.
visto che ci sei, controlla anche che l'apertura del file in scrittura abbia avuto successo (se passi un puntatore a NULL ad fprintf() poi ti esplode tutto :D).


ciao ;)

Unrue
08-05-2008, 20:19
Perché fscanf() non ha bisogno di sapere la precisione del numero in virgola mobile che hai impostato, che invece serve a fprintf() per troncarlo o estenderlo durante la formattazione: provandolo a compilare con gcc qui mi avverte, con %8.2f, che sto passando un formato non valido, e mi dà questo warning:
warning: unknown conversion type character '.' in format

Quindi qualche piccolo consiglio:
compila sempre con le opzioni -W -Wall: ti darà un po' più di rotture all'inizio, ma ti evita parecchi mal di testa poi.
puoi migliorare la leggibilità del codice evitando il blocco else dopo il controllo su fp==NULL: nel blocco if hai un return, quindi se la condizione è soddisfatta il codice non continuerà l'esecuzione; in caso contrario, continuerà a fare il suo lavoro, per cui togliere l'else non modificherà il comportamento del programma.
visto che ci sei, controlla anche che l'apertura del file in scrittura abbia avuto successo (se passi un puntatore a NULL ad fprintf() poi ti esplode tutto :D).


ciao ;)

Grazie per le risposte, davvero utili :)

DanieleC88
08-05-2008, 20:28
Figurati. ;)

DanieleC88
08-05-2008, 20:30
Ah già dimenticavo! ( :D ) In math.h è definita la costante M_PI, quindi non hai bisogno di ridefinire PI, a meno che non ti serva una precisione diversa. ;)