Чтение чисел ASCII с использованием D вместо E для экспоненциального представления с использованием C

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

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

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

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

Спасибо.


person Escualo    schedule 31.03.2010    source источник


Ответы (3)


Вы можете воспользоваться преимуществами 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
person Sinan Ünür    schedule 31.03.2010
comment
Я разочарован тем, что в C отсутствует встроенная поддержка чтения экспоненциальной записи с использованием D вместо E. Предлагаемый вами код наиболее близок к идеальному решению. Спасибо! - person Escualo; 01.04.2010
comment
@Arrieta: я разочарован, что он не может анализировать числа, где вместо цифры 0 (ноль) появляется буква Q. Похоже, разработчики библиотек не поняли, насколько важны наши требования для такого количества программ... ;-) - person Tony Delroy; 22.06.2012

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

person Andrey    schedule 31.03.2010

Здесь эта функция заключается в замене «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.

person Tong    schedule 20.05.2014