1

我正在尝试从 RINEX 文件中的行中读取多个数字。文件编号类似于:

12345.67890

但是,由于 RINEX 格式,12345.6789 表示测量值,而小数点末尾的 0 实际上表示其他内容。我正在使用基本的方式来阅读:

Rinexfile>>double_temp;

我得到 double_temp=12345.67890 我想做的地方

Rinexfile>>double_temp>>int_temp;

并且有 double_temp=12345.6789 和 int_temp=0。格式总是相同的,即 4 位小数属于双精度,然后是一个 int,我使用的是 VS2010

谢谢

4

3 回答 3

1

您需要更复杂的方法:

std::string word;
Rinexfile >> word;
std::size_t dot_pos = str.find('.');
if (dot_pos != std::string::npos) {
    std::string doublePart = word.substr(0, dot_pos + 1 + 4);  // 4 decimals
    std::string intPart = word.substr(dot_pos + 1 + 4);
    std::istringstream is(doublePart), is2(intPart);
    is >> double_temp;
    is2 >> int_temp;
}

这以 single 形式读取输入std::string并将其分为 2 部分:doublePart是一个包含'.'符号和后面的 4 个字母的字符串。intPart是这个词的其余部分。构造临时实例std::istringstream以检索值。

注意:可能需要额外的错误处理。

于 2013-10-05T18:44:53.470 回答
1

浮点的默认输入格式将读取小数点后的位数。std::num_get<char>但是,可以通过使用自定义方面并安装合适的语言环境来更改用于解析值的函数。这是大致的样子(目前我无法轻松测试代码):

#include <locale>
#include <cstdlib>
#include <cctype>

struct num_get
    : std::num_get<char>
{
    iter_type do_get(iter_type it, iter_type end, std::ios_base& fmt,
                     std::ios_base::iostate& err, double& value) const {
        char buf[64];
        char* to(buf), to_end(buf + 63);
        for (; it != end && to != to_end
             && std::isdigit(static_cast<unsigned char>(*it)); ++it, ++to) {
            *to = *it;
        }
        if (it != end && *it == '.') {
            *to = *it;
            ++it;
            ++to;
        }
        to_end = to_end - to < 4? to_end - to: to + 4;
        for (; it != end && to != to_end
             && std::isdigit(static_cast<unsigned char>(*it)); ++it, ++to) {
            *to = *it;
        }
        *to = 0;
        if (std::strtod(buf, 0, &value) != to) {
            err |= std::ios_base::failbit;
        }
        return it;
    }
};

使用这个解码器(虽然它可能想要进行更多的错误检查),您只需设置您的流,然后正常读取:

in.imbue(std::locale(std::locale(), new num_get));
double dval;
int    ival;
if (in >> dval >> ival) {
    std::cout << "read dval=" << dval << " ival=" << ival << '\n';
}
于 2013-10-05T19:08:00.973 回答
0

如果您不想弄乱字符串,您可以分别读取整数和小数部分并获取所需的数据,如下所示: int i, d;

cin >> i;
cin.get();  // skip decimal point
cin >> d;

double value = i + (d / 10) / 10000.0;
int something_else = d % 10;

cout << setprecision(4) << fixed << value << endl << something_else;

(如果“其他”可以长于 1 位,它将不起作用)

于 2013-10-05T18:56:44.780 回答