我正在尝试从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
由于
答案 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位,则不起作用)