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

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

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

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

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

谢谢。

你可以利用strtod和strtok :

 #include  #include  #include  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 

用E代替D,沿着字符串循环。 然后。

这里的function是用“D”将科学记数法中的“D”替换为“E”。

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

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

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