C++:将流中的小数解析为 uint8_t
C++: Parse decimal from stream into uint8_t
有没有一种方法可以直接使用流操作符来执行以下操作?
uint8_t actual;
uint32_t temporary;
std::cin >> std::dec >> temporary;
if (temporary > UINT8_MAX) {
// error
}
actual = static_cast<uint8_t>(temporary);
特别是,我想将足够小的十进制数解析为 uint8_t
,而不求助于更大的临时变量。
您可以直接将输入流式传输到 uint8_t
变量中,如下所示:
uint8_t actual;
std::cin >> std::dec >> actual;
如果您的输入太大,比如说您输入了“12000”,您的 actual
变量将保存 1
的值
不,我认为没有办法用 std::istream
直接将数字读入 unsigned char
(std::num_get::get
不支持 unsigned char
)
你可以把它封装成一个函数:
inline std::uint8_t read_uint8(std::istream& is) {
unsigned short temporary;
is >> temporary;
if (!is) return -1;
if (temporary > UINT8_MAX) {
is.setstate(std::ios_base::failbit);
return -1;
}
return std::uint8_t(temporary);
}
int main() {
std::uint8_t actual = read_uint8(std::cin);
if (!std::cin) {
// error
}
}
或者你可以做类似 std::put_money
或 std::osyncstream
的事情,并包装一个参数来调用自定义 operator>>
:
struct read_uint8 {
std::uint8_t& v;
read_uint8(std::uint8_t& v) : v(v) {}
};
inline std::istream& operator>>(std::istream& is, read_uint8 v) {
unsigned short temporary;
is >> temporary;
if (is) {
if (temporary > UINT8_MAX) {
is.setstate(std::ios_base::failbit);
} else {
v.v = std::uint8_t(temporary);
}
}
return is;
}
int main() {
std::uint8_t actual;
if (!(std::cin >> read_uint8(actual))) {
// error
}
}
有没有一种方法可以直接使用流操作符来执行以下操作?
uint8_t actual;
uint32_t temporary;
std::cin >> std::dec >> temporary;
if (temporary > UINT8_MAX) {
// error
}
actual = static_cast<uint8_t>(temporary);
特别是,我想将足够小的十进制数解析为 uint8_t
,而不求助于更大的临时变量。
您可以直接将输入流式传输到 uint8_t
变量中,如下所示:
uint8_t actual;
std::cin >> std::dec >> actual;
如果您的输入太大,比如说您输入了“12000”,您的 actual
变量将保存 1
不,我认为没有办法用 std::istream
直接将数字读入 unsigned char
(std::num_get::get
不支持 unsigned char
)
你可以把它封装成一个函数:
inline std::uint8_t read_uint8(std::istream& is) {
unsigned short temporary;
is >> temporary;
if (!is) return -1;
if (temporary > UINT8_MAX) {
is.setstate(std::ios_base::failbit);
return -1;
}
return std::uint8_t(temporary);
}
int main() {
std::uint8_t actual = read_uint8(std::cin);
if (!std::cin) {
// error
}
}
或者你可以做类似 std::put_money
或 std::osyncstream
的事情,并包装一个参数来调用自定义 operator>>
:
struct read_uint8 {
std::uint8_t& v;
read_uint8(std::uint8_t& v) : v(v) {}
};
inline std::istream& operator>>(std::istream& is, read_uint8 v) {
unsigned short temporary;
is >> temporary;
if (is) {
if (temporary > UINT8_MAX) {
is.setstate(std::ios_base::failbit);
} else {
v.v = std::uint8_t(temporary);
}
}
return is;
}
int main() {
std::uint8_t actual;
if (!(std::cin >> read_uint8(actual))) {
// error
}
}