浮動點默認的輸入格式有小數點後面將讀取儘可能多的數字。但是,可以通過使用自定義的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';
}
如何測試此方法,如果它只有3位小數。現在發生了什麼,如果我把它的單詞123.456拋出,所以我想基本上將它分解爲if(if>(word> 3 decimals))else – user2840470