1

我有一个看起来像这样的数字列表:1.234D+11.234D-02。我想使用 C 读取文件。该函数atof将仅忽略D并仅翻译尾数。

该函数fscanf将不接受该格式'%10.6e',因为它期望指数E中的 a 而不是 a D

当我在 Python 中遇到这个问题时,我放弃了,只是在从字符串转换为浮点数之前使用了字符串替换。但是在 C 中,我相信一定有另一种方式

那么,您将如何读取带有数字的文件D而不是E科学记数法呢?请注意,我不是指如何读取字符串本身,而是如何将它们转换为浮点数。

谢谢。

4

3 回答 3

2

您可以利用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
于 2010-03-31T17:42:17.790 回答
1

通过沿着字符串循环,用 E 替换 D。然后atof

于 2010-03-31T17:33:17.950 回答
0

这里这个功能就是用“D”将科学计数法中的“D”替换为“E”。

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 字符串。

于 2014-05-20T05:47:19.723 回答