如何在C++中读取FORTRAN格式的数字
How to read FORTRAN formatted numbers in C++
我有一个文件,里面有几行数字,看起来像这样:
1.000000-5 2.436700+0 2.530000-2 2.436700+0 5.000000-2 2.436700+0
1.000000+1 2.436700+0 1.000000+2 2.433800+0 1.000000+3 2.433800+0
我需要用C++阅读这篇文章才能获得数字
1.0E-5 2.4367E0 2.53E-2 2.4367E0 5.0E-2 2.4367E0
1.0E1 2.4367E0 1.0E2 2.4338E0 1.0E3 2.4338E0
挑战在于,在文件的编号中没有E
;CCD_ 2指示指数表示法。
我怎么能把这样的东西读成浮子?它需要非常高效,因为我必须为每个文件读取数十万或数百万次这样的数字。
关于如何实现这一点,有什么建议吗?
您应该编写一个解析器。一个简单的实现是:
#include <iostream>
#include <sstream>
#include <vector>
int main() {
// Signed data set
std::istringstream input(
"+1.000000-5 -2.436700+0 +2.530000-2 -2.436700+0 +5.000000-2 -2.436700+0n"
"+1.000000+1 -2.436700+0 +1.000000+2 -2.433800+0 +1.000000+3 -2.433800+0");
std::vector<double> result;
std::string in;
while(input >> in) {
auto e = in.find_last_of("+-");
if(0 < e && e != std::string::npos) {
in.replace(e, 1, std::string("E") + in[e]); // this might get a optimization
}
std::istringstream number(in);
double d;
number >> d;
result.push_back(d);
}
for(auto d: result) std::cout << std::fixed << d << std::endl;
return 0;
}
我只需在每个-或+之前添加E,并在其上使用atof
或strtof
。
如果这对你来说还不够快,请查看你最喜欢的atof
实现(我用简单的搜索找不到一个,但应该不会太难),并对其进行更改,使其不查找E,只查找-或+。
将字符串扫描到+或-(或空格)字符并存储。将+或-替换为null,并将字符串传递给atof以获得第一部分。然后,如果你在指数中进行了+或-扫描。一旦在int或double中有了它,就使用value * pow(10.0, exponent)
。或者您可以使用strtod并避免null修改。
或者,如前所述,修改现有的atof实现。
这是我刚刚快速破解的东西,您需要测试它是否适用于所有情况:
ifstream file;
file.open("f:\stackoverflow\fortranfloat\fortranfloats.txt");
string line;
if (file.is_open())
{
while (file.good())
{
getline(file, line);
for (int i = 0; i < line.length(); i++)
{
int j = 0;
char buf[10];
while (i < line.length() && line[i] != ' ')
{
if (line[i] == '-' || line[i] == '+')
buf[j++] = 'e';
buf[j++] = line[i++];
}
float number = atof(buf);
cout << "Number: " << number << endl;
}
}
file.close();
}
else
{
cout << "Failed to open file" << endl;
}
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 将RGB图像保存为PPM格式
- 询问在设计我的手臂模拟器功能表示格式1
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 如何将strftime中的格式错误作为异常捕获
- 将CHW格式的浮点向量转换为cv::Mat
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 输出类似于 FORTRAN 的无格式C++
- 如何在C++中读取FORTRAN格式的数字
- 在C++中使用类似Fortran的格式对文本文件进行迭代