2014-06-21 8 views
5

Próbuję odczytać plik, który ma następującą zawartość:Reading Scientific Notation w C

1.0000000e + 01 2.9265380e + 03 + 02 4.3231640e 5.0821200e + 01

2.0000000e + 01 1.0170240e 9.2798610e + 04 + 02 4.0723180e + 01

3.0000000e 2.1486260e + 01 + 04 + 03 1.1832420e 1.0328000e + 01

4.0000000e 3.3835080e + 01 + 04 + 03 1.1882285e - 9.3307000e + 00

5.0000000e 4.5250830e + 01 + 04 + 03 1.0899705e -1.0320900e + 01

6.0000000e 5.5634490e + 01 + 04 + 02 9.8935650e -9.8019000e + 00

7.0000000e + 01 6,5037960 e + 04 8.9134700e + 02 -9.8000000e + 00

ale nie mogę znaleźć odpowiedniego sposobu na odczytanie notacji naukowej. Oto co mam kodu:

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

int main() 
{ 
    // This is the array to store the input 
    double time[24], altitude[24], velocity[24], acceleration[24]; 
    double var1, var2, var3, var4; 

    //This is the pointer declaration for opening a file 
    FILE * fp = fopen("rocket.txt", "r"); 

    int i = 0; 

    while(fscanf(fp,"%g %f %f %f", &var1, &var2, &var3, &var4) > 0){ 
     time[i] = var1; 
     altitude[i] = var2; 
     velocity[i] = var3; 
     acceleration[i] = var4; 
     printf("Time: %f \n", &time[i]); 
     i++; 
    } 

    printf("Time: %f", &time[0]); 

    fclose(fp); 

    return(0); 
} 

Próbowałem wielu kombinacji %f, %g, %d spróbować wydrukować wynik, ale nigdy nie może dostać słusznie.

Jeśli ktoś może wskazać mi właściwy kierunek, bardzo to doceniam.

+0

Nie użyj 'fscanf()' do parsowania ciągów. –

Odpowiedz

13

Co chcesz użyć jest %lf dla wejścia i %e wyjścia w notacji naukowej:

scanf("%lf", &input); 
printf("%e\n", input); 
+0

, który działał idealnie. Dzięki! –

0

można użyć, E, F lub G w specyfikatora konwersji takich jak to:

fscanf(fp, "%a", &input); // NOTE: only with C99 compilers 
fscanf(fp, "%e", &input); 
fscanf(fp, "%f", &input); 
fscanf(fp, "%g", &input); 

będą wszystkie prace w celu analizowania pływaków, ale dla deblu będzie trzeba użyć modyfikatora długości „l” tak:

fscanf(fp, "%le", &input); 

Aby wydrukować wartości, można użyć dowolnego z specyfikatorami ale nie trzeba modyfikator długości „l”:

printf("%e ", input); // or f or g (or a C99 compilers only) 
printf("%le ", input); // produces the same thing 

Naprawdę pomocne odniesienia jest tutaj: http://en.cppreference.com/w/c/io/fscanf