C ++读取两个数字,但没有空格,RINEX文件

时间:2013-10-05 18:36:22

标签: c++ file-io int double filestream

我正在尝试从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个小数属于double,然后是int,我使用的是VS2010

由于

3 个答案:

答案 0 :(得分: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;
}

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

注意:可能需要进行其他错误处理。

答案 1 :(得分: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';
}

答案 2 :(得分: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位,则不起作用)