从 std::stringstream 读取uint8_t为数字类型
Read uint8_t from std::stringstream as a numeric type
我的理解是,从stringstream
读取uint8_t
是一个问题,因为stringstream
会将uint8_t
解释为char
。我想知道如何以数字类型从stringstream
读取uint8_t
。例如,以下代码:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
uint8_t ui;
std::stringstream ss("46");
ss >> ui;
cout << unsigned(ui);
return 0;
}
打印出52
.我希望它打印出46
.
编辑:另一种方法是从stringstream
中读取string
,然后将解决方案转换为uint8_t
,但这破坏了良好的链接属性。例如,在我必须编写的实际代码中,我经常需要这样的东西:
void foobar(std::istream & istream){
uint8_t a,b,c;
istream >> a >> b >> c;
// TODO...
}
您可以重载uint8_t
的输入operator>>
,例如:
std::stringstream& operator>>(std::stringstream& str, uint8_t& num) {
uint16_t temp;
str >> temp;
/* constexpr */ auto max = std::numeric_limits<uint8_t>::max();
num = std::min(temp, (uint16_t)max);
if (temp > max) str.setstate(std::ios::failbit);
return str;
}
现场演示:https://wandbox.org/permlink/cVjLXJk11Gigf5QE
说实话,我不确定这样的解决方案是否没有问题。更有经验的人可能会澄清。
更新
请注意,此解决方案通常不适用于std::basic_istream
(以及它的实例std::istream
(,因为unsigned char
有一个重载operator>>
:[istream.extractors]。然后,该行为将取决于uint8_t
的实现方式。
格式化的方式阅读,请不要使用char
或unsigned char
(uint8_t(。示例代码及其结果是预期行为。
正如我们从 https://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2 中看到的
template< class Traits >
basic_istream<char,Traits>& operator>>( basic_istream<char,Traits>& st, unsigned char& ch );
这将执行"执行字符输入操作"。
52
是"4"的ASCII代码。这意味着stringstream
只读取了一个字节,并且仍然准备读取"6"。
因此,如果你想以所需的方式工作,你应该使用 2 字节或更大的整数类型进行sstream::operator>>
然后将其转换为 uint8_t
- 你自我回答的确切方式。
下面是这些重载的参考。https://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt
经过反复讨论,答案似乎是没有标准的方法可以做到这一点。选项是将uint8_t
读出为uint16_t
或std::string
,然后将这些值转换为uint8_t
:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
uint8_t ui;
uint16_t tmp;
std::stringstream ss("46");
ss >> tmp;
ui = static_cast<uint8_t>(tmp);
cout << unsigned(ui);
return 0;
}
但是,这样的解决方案忽略了范围检查。因此,如果需要,您将需要自己实现它。
- 你能在 c++ 中将不同的数字类型加在一起吗?
- 检测<T>某些非数字类型 T 的 std::numeric::type 的特化
- 为什么数字类型只有"to_string()"?
- 从 std::stringstream 读取uint8_t为数字类型
- 枚举超过了最大数字类型的大小
- 为什么将指针铸成数字类型是不安全的
- 我应该始终将适当的文字用于数字类型
- 如何识别C中字符串中包含的数字类型
- 如何对具有带符号数字类型的事物进行谓词
- 我可以得到一个适用于任何数字类型的模板化均匀分布生成器吗?
- C++隐式数字类型降级
- 依靠任何数字类型(无符号、整数等)的隐式提升来加倍是否安全
- 用于显示不同数字类型的函数重载
- 创建几个相互不兼容的数字类型
- 同类数字类型之间的转换
- 数字类型介于0和1之间
- 将字符串转换为数字类型的通用方法
- 为小循环计数器选择什么数字类型
- 如何将处理不同数字类型的C函数库包装到c++模板类中
- 如何将来自用户定义文字的可变char模板参数转换回数字类型