Чтение чисел ASCII с использованием «D» вместо «E» для научной записи с использованием C - PullRequest
1 голос
/ 31 марта 2010

У меня есть список чисел, который выглядит следующим образом: 1.234D+1 или 1.234D-02. Я хочу прочитать файл, используя C. Функция atof просто проигнорирует D и переведет только мантиссу.

Функция fscanf не будет принимать формат '%10.6e', потому что ожидает E вместо D в показателе степени.

Когда я столкнулся с этой проблемой в Python, я сдался и просто использовал подстановку строк перед преобразованием из строки в число с плавающей точкой. Но в Си я уверен, что должен быть другой путь .

Итак, как бы вы прочитали файл с числами, используя D вместо E для научной записи? Обратите внимание, что я имею в виду не как читать сами строки, а как конвертировать их в числа с плавающей точкой.

Спасибо.

Ответы [ 3 ]

1 голос
/ 31 марта 2010

Вы можете воспользоваться strtod и strtok :

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

int main(void) {
    char in[] = "1.234D+1 ABCD 1.234D-02 5\n";
    char *cursor;
    char *endp;
    for ( cursor = strtok(in, " "); cursor; cursor = strtok(NULL, " ")) {
        double d = strtod(cursor, &endp);
        if ( *endp == 'D' ) {
            *endp = 'e';
            d = strtod(cursor, &endp);
        }
        if ( endp != cursor ) {
            printf("%e\n", d);
        }
    }
    return 0;
}

Выход:

E:\> cnv
1.234000e+001
1.234000e-002
5.000000e+000
1 голос
/ 31 марта 2010

замените D на E, зацикливаясь вдоль строки. затем atof.

0 голосов
/ 20 мая 2014

Здесь эта функция заменяет «D» на «E» в научной записи на «D».

std::string dToE(string cppstr)
{
    str1.replace(cppstr.find("D"),1,"E");
    return cppstr;
}

Если строка C для научных обозначений определяется как: char * cstr = "1.2D + 03"; или обычно получаемый методом strtok, который возвращает строку C, затем используйте atof(dToE(string(cstr)).c_str()), чтобы получить научную нотацию с "E".

Поскольку atof принимает только строку в стиле C, вы должны использовать c_str() метод строки для преобразования строки C ++ в строку C.

...