2011-08-22 12 views
7

sembra comune ed evidente ma ho già letto il file txt in C in passato e qui sono davvero bloccato.Leggere un file di testo .txt in C che contiene float, separato dallo spazio

Ho un file txt di questo formato

0.00000587898458 0.0014451541000 0.000000000001245 
0.00012454712235 0.1245465756945 0.012454712115140 

... con 640 colonne e 480 linee.

Voglio mettere ciascun numero del mio file txt in un float con la massima precisione possibile e in un ciclo for.

FILE* myfile=NULL; 
double myvariable=0.0; 
myfile=fopen("myfile.txt","r"); 

for(i =0, k=0 ; i< height; i++) 
    for (j=0 ; j< width ; j++){ 
fscanf(myfile,"%0.20f",&myvariable); 
printf("%0.20f",myvariable); 
k++; 
} 
} 
fclose(myfile); 

La ringrazio molto per il vostro aiuto

+1

cosa non funziona? – arnaud576875

+0

Continua a leggere nulla, è pieno di zeri ma con la giusta precisione 0,00000000000. Ho provato a cambiare il mio primo numero ed è sempre lo stesso. – thomsala

+2

ignorare gli avvisi è una pessima pratica –

risposta

8

ci sono diversi errori nel programma - parentesi non corrispondenti, le variabili non definite, ecc Il più importante, tuttavia, e la più probabilità di essere la causa del problema, è che non sta passando un puntatore a myvariable nella tua chiamata fscanf(). Ti consigliamo di utilizzare &myvariable lì, in modo che fscanf() possa riempirlo in modo appropriato. Probabilmente non è necessario che la stringa di formato sia così complicata: "%lf" dovrebbe funzionare bene per leggere un double. In realtà, gcc mi avverte con la vostra stringa di formato:

example.c:16: warning: zero width in scanf format 
example.c:16: warning: unknown conversion type character ‘.’ in format 

E poi la mia uscita diventa solo 0. Prova "%lf". Ecco un esempio completo che lavora con il vostro input di esempio:

#include <stdio.h> 

#define HEIGHT 2 
#define WIDTH 3 

int main(void) 
{ 
    FILE *myfile; 
    double myvariable; 
    int i; 
    int j; 

    myfile=fopen("myfile.txt", "r"); 

    for(i = 0; i < HEIGHT; i++) 
    { 
    for (j = 0 ; j < WIDTH; j++) 
    { 
     fscanf(myfile,"%lf",&myvariable); 
     printf("%.15f ",myvariable); 
    } 
    printf("\n"); 
    } 

    fclose(myfile); 
} 

Esempio gestito:

$ ./example 
0.000005878984580 0.001445154100000 0.000000000001245 
0.000124547122350 0.124546575694500 0.012454712115140 
+0

scusate che era un refuso per il & – thomsala

2
fscanf(myfile,"%0.20f",myvariable); 

Devi passare un puntatore, utilizzare & myVariable invece. Fissare:

fscanf(myfile, "%lf", &myvariable); 
+0

Sì scusa ho commesso un errore quando lo copio qui. Ma c'era un codice & nel mio codice – thomsala

+1

'% 0.20f' non ha senso. 'fscanf' non usa larghezza/precisione' printf'. Basta usare '% lf'. –

0
  1. Tu dici che sono bloccati, ma non entrare nello specifico riguardo a ciò che è esattamente il problema che si è verificato.
  2. Molto probabilmente si intende passare l'indirizzo di "myvariable" a fscanf.
  3. Anche se non ti interessa molto della precisione (e nel tuo caso, dici chiaramente che fai), dovresti preferire il doppio rispetto al float. Dovresti scegliere float solo quando hai una ragione molto forte per preferire il float al doppio, e anche quello, dovrebbe essere in situazioni molto specifiche.
  4. Controllare sempre le chiamate su fopen per assicurarsi che siano riuscite.
+0

scusa è stato un errore di battitura per il & – thomsala

2

posso solo immaginare, dal momento che non ci avete mostrato il vostro codice sorgente vero e proprio, ma ...

fscanf Il formato "%f" prevede un puntatore a float; gli stai dando un puntatore a double. Questo è probabilmente ciò che sta causando il problema che stai vedendo. Utilizzare "%lf" per double (o "%Lf" per long double).

Sì, questa è un'incoerenza tra le funzioni *printf e *scanf. Esiste perché gli argomenti float a *printf vengono promossi a double; non esiste una tale promozione per i puntatori, come gli argomenti float* che è possibile passare a fscanf.

E utilizzare solo "%lf", non "%0.20lf"; Non sono sicuro che quest'ultimo sia valido.

+0

utile per puntare i diversi tipi di dati di "float" e "double" nella lettura. – Patric

Problemi correlati