使用“读取ASCII码”;D";而不是",;";对于使用C的科学记数法

使用“读取ASCII码”;D";而不是",;";对于使用C的科学记数法,c,string,scanf,scientific-notation,atof,C,String,Scanf,Scientific Notation,Atof,我有一个如下的数字列表:1.234D+1或1.234D-02。我想用C来读取文件。函数atof只会忽略D,只翻译尾数 函数fscanf将不接受格式'%10.6e',因为它需要指数中的E而不是D 当我在Python中遇到这个问题时,我放弃了,只是在从字符串转换为浮点之前使用了字符串替换但是在C语言中,我确信一定有另一种方法 那么,您如何使用D而不是E来读取带有数字的文件作为科学记数法呢?请注意,我指的不是如何读取字符串本身,而是如何将它们转换为浮点 谢谢。沿字符串循环,将D替换为E。然后atof您

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

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

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

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


谢谢。

沿字符串循环,将D替换为E。然后
atof

您可以利用和:

#包括
#包括
#包括
内部主(空){
[]中的字符=“1.234D+1 ABCD 1.234D-02 5\n”;
字符*光标;
char*endp;
for(cursor=strtok(in,“”);cursor;cursor=strtok(NULL,“”){
双d=strtod(游标和endp);
如果(*endp=='D'){
*endp='e';
d=标准时间(光标和结束点);
}
如果(endp!=光标){
printf(“%e\n”,d);
}
}
返回0;
}
输出:

E:\> cnv 1.234000e+001 1.234000e-002 5.000000e+000 E:\>cnv 1.234000e+001 1.234000e-002
5.000000e+000此函数用于将科学记数法中的“D”替换为“E”

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


自从<>代码> <代码> >只接受C风格字符串,你应该使用<代码> CyString()/Cuth.String方法将C++字符串转换成C字符串。

我很失望C缺少自然支持,用“<代码> d>代码>读取科学符号,而不是<代码> E<代码>。您提出的代码是最接近完美解决方案的。谢谢@阿丽塔:我很失望它不能解析字母Q而不是数字0(零)出现的数字。似乎库设计者不明白我们的需求对于这么多程序来说有多么重要…;-) E:\> cnv 1.234000e+001 1.234000e-002 5.000000e+000
std::string dToE(string cppstr)
{
    str1.replace(cppstr.find("D"),1,"E");
    return cppstr;
}