读取数字并将它们转换为双打?

时间:2009-10-27 13:39:15

标签: c++ file-io

好的,所以我有一个相当讨厌的问题,我们使用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或任何其他库)

2 个答案:

答案 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的派生,从该文件的格式解析双精度。这可能是理论上正确的方式,但是这部分库的文档大部分都很差,所以我很难建议它。