使用“D”代替“E”读取ASCII数字用于科学记数法
我有一个数字列表,如下所示: 1.234D+1
或1.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字符串。