Чтение научной нотации в C

#c #scientific-notation

#c #научная нотация

Вопрос:

Я пытаюсь прочитать файл, который имеет следующее содержимое:

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

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

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

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

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

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

7.0000000e 01 6.5037960e 04 8.9134700e 02 -9.8000000e 00

но, похоже, я не могу найти правильный способ чтения научной нотации. Вот что у меня есть из кода:

 #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", amp;var1, amp;var2, amp;var3, amp;var4) > 0){
        time[i] = var1;
        altitude[i] = var2;
        velocity[i] = var3;
        acceleration[i] = var4;
        printf("Time: %f n", amp;time[i]);
        i  ;
    }

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

   fclose(fp);

   return(0);
}
 

Я пробовал несколько комбинаций %f, %g, %d , чтобы попытаться распечатать результат, но я никогда не могу получить правильную вещь.

Если кто-нибудь может указать мне правильное направление, я буду очень признателен.

Комментарии:

1. Не используйте fscanf() для синтаксического анализа строк.

Ответ №1:

То, что вы хотите использовать, предназначено %lf для ввода и %e вывода в научной нотации:

 scanf("%lf", amp;input);
printf("%en", input); 
 

Ответ №2:

Вы могли бы использовать a, e, f или g в спецификаторе преобразования следующим образом:

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

Все они будут работать для синтаксического анализа чисел с плавающей запятой, но для удвоения вам нужно будет использовать модификатор длины «l» следующим образом:

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

Для печати значений вы можете использовать любой из спецификаторов, но вам не нужен модификатор длины «l»:

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

Действительно полезная ссылка здесь:
http://en.cppreference.com/w/c/io/fscanf