使用“D”代替“E”读取ASCII数字用于科学记数法

时间:2010-03-31 17:31:00

标签: c string scanf scientific-notation atof

我有一个如下所示的数字列表:1.234D+11.234D-02。我想用C读取文件。函数atof将忽略D并仅翻译尾数。

函数fscanf不接受格式'%10.6e',因为它希望指数中有E而不是D

当我在Python中遇到这个问题时,我放弃了,只是在从string转换为float之前使用了字符串替换。 但在C中,我确信必须采用其他方式

那么,对于科学记数法,您如何使用D而不是E来读取包含数字的文件?请注意,我并不是指如何读取字符串本身,而是如何将它们转换为浮点数。

感谢。

3 个答案:

答案 0 :(得分:1)

通过循环字符串将E替换为E.然后atof

答案 1 :(得分:1)

您可以利用strtodstrtok

#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

答案 2 :(得分:0)

此功能是替换&#34; D&#34;进入&#34; E&#34;用&#34; D&#34;的科学记数法。

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

如果科学记数法的C字符串定义如下:     char * cstr =&#34; 1.2D + 03&#34 ;; 或者通常通过strtok方法获得,该方法返回C字符串,然后使用atof(dToE(string(cstr)).c_str())以&#34; E&#34;来获得科学记数法。

由于atof只接受C样式字符串,因此应使用c_str()字符串方法将C ++字符串转换为C字符串。