|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
[C] leggere float da file
Salve, ho un file così organizzato
1 0.5 0 0 0 1 0.3 0.6 1 0 1 1 0.5 1 0 1 1 1 0 0 0 1 1 0 1 0.3 0.6 1 0 1 1 0 1 1 1 1 0 0 In pratica è una matrice quadrata. Quale funzione posso usare per prendere un numero alla volta (da sinistra verso destra, dall'alto verso il basso) per metterli in un array di float? Le varie getc getchar & co. li trattano come caratteri? A me servono proprio come numeri. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
FILE *f; float val; ... fscanf (f, "%f", &val);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
while (!fi.eof()) { for (int i=0; i<5; i++){ for (int j=0; j<5; j++){ fi>>MyFloatArray[i,j]; |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
FILE *fich=fopen("MyFile", "r"); if(fich==NULL) { fclose(fich); return; } for (int i=0; i<5; i++) for (int j=0; j<5; j++) fscanf (fich, "%f", &MyFloatArray[i,j]); fclose(fich); si infatti.... in c |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
|
|
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Quote:
|
|
|
|
|
|
|
#9 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
In realtà, se sai che il file è formato da cinque righe di testo, ciascuna delle quali contiene cinque numeri, puoi leggere direttamente una riga alla volta. Ad esempio, se hai dichiarato: Codice:
float a[5][5]; FILE *fin; Codice:
for (i=0; i<5; i++)
fscanf(fin,"%f%f%f%f%f",a[0],a[0]+1,a[0]+2,a[0]+3,a[0]+4);
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
|
#10 |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Se invece ho una matrice tipo
1 1/2 1/3 1/4 1/3 1/2 1/2 1/4 ... e volessi prendere i valori fratti come numeri, come mi consigliereste di farlo? Cioè leggo 1/3 e ad una variabile float assegno il valore 1/3 (che è 0.333333). |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quindi prendi le singole stringhe "1", "1/2", ecc... e per ognuna controlli se contiene il carattere '/' (puoi usare strchr). Se non è presente, converti la stringa direttamente in float con la funzione atof. Se invece il carattere '/' è presente, spezzi la stringa e prendi i due valori come interi (suppongo, come sarebbe logico, che siano degli interi). A quel punto fai tu la divisione a/b ed ottieni il float.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Ottimo, lo stesso metodo che ho utilizzato (dopo che ho postato). Volevo solo sapere se c'era un modo meno macchinoso. Grazie!
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
In ogni caso, se ti arriva una frazione, il calcolo lo devi fare tu. Non esiste (almeno nella libreria standard del C) una funziona che faccia da "interprete" di espressioni matematiche. Un esempio molto semplice è questo: Codice:
float str_to_float (char *str)
{
char *p;
float f;
if ((p = strchr (str, '/')) == NULL)
f = atof (str);
else
{
*p = '\0';
f = (float) atoi (str) / atoi (p+1);
}
return f;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#14 |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
L'abbiamo fatto praticamente allo stesso modo ma permettimi di correggere questa riga
f = (float) atoi (str) / atoi (p+1); se per esempio do atoi("2")/atoi("3") il risultato è 0.333333 ma essendo una divisione tra 2 int il risultato è ancora un int che viene troncato a 0 e la successiva conversione a float è inutile. Ho corretto facendo f = (float) ((float)atoi(str)) / ((float)atoi (p+1)); Correggimi se sbaglio! |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
L'operatore di cast (tipo) è di un gradino più prioritario rispetto alla divisione. Questo vuol dire che nella riga: Codice:
f = (float) atoi (str) / atoi (p+1); I cast che hai fatto tu non sono sbagliati ma solo un po' inutili.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#16 |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Perdonami, hai ragione! Inizialmente sbagliavo perchè mettevo la divisione fra parentesi e quindi la priorità cambiava. Grazie!
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:34.



















