我有一个如下所示的数字列表:1.234D+1
或1.234D-02
。我想用C读取文件。函数atof
将忽略D
并仅翻译尾数。
函数fscanf
不接受格式'%10.6e'
,因为它希望指数中有E
而不是D
。
当我在Python中遇到这个问题时,我放弃了,只是在从string转换为float之前使用了字符串替换。 但在C中,我确信必须采用其他方式。
那么,对于科学记数法,您如何使用D
而不是E
来读取包含数字的文件?请注意,我并不是指如何读取字符串本身,而是如何将它们转换为浮点数。
感谢。
答案 0 :(得分:1)
通过循环字符串将E替换为E.然后atof
。
答案 1 :(得分:1)
#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字符串。