好的,所以我有一个相当讨厌的问题,我们使用hdp的应用程序之一,将HDF值转储到文本文件。
基本上我们有一个由以下内容组成的文本文件:
-8684 -8683 -8681 -8680 -8678 -8676 -8674 -8672 -8670 -8668 -8666
-8664 -8662 -8660 -8657 -8655 -8653 -8650 <trim... 62,000 more rows>
这些代表双重: E.g:
-8684 = -86.84
我们知道这些值将介于180 - >之间。 -180。但我们还必须处理大约65,000行。所以时间有点重要。
最好的方法是什么? (由于内部标准,我不能使用Boost或任何其他库)
答案 0 :(得分:4)
如您所愿,作为答案......:)
你不能只使用标准的iostream吗?
double val; cin >> &val; val/=100;
冲洗,重复62000 * 11次
答案 1 :(得分:0)
我想我的工作方式有点不同。我创建了一个小型的sorta-proxy类来处理读取值并将其转换为double:
class fixed_point {
double val;
public:
std::istream &read(std::istream &is) {
is >> val; val /= 100.0; return is;
}
operator double() { return val; }
friend std::istream &operator>>(std::istream &is, fixed_point &f) {
return f.read(is);
}
};
使用它,我可以更干净地读取我的数据。例如:
std::vector<double> my_data;
std::copy(std::istream_iterator<fixed_point>(infile),
std::istream_iterator<fixed_point>(),
std::back_inserter(my_data));
这里的重点是运营商&gt;&gt;不只是读取原始数据,而是从原始数据中提取真实信息(以您可以使用的格式)。
还有其他方法可以完成这项工作。例如,您还可以创建std :: num_get的派生,从该文件的格式解析双精度。这可能是理论上正确的方式,但是这部分库的文档大部分都很差,所以我很难建议它。