字符串流十进制整数输入到 8 位类型
istringstream decimal integer input to 8-bit type
This:
#include <iostream>
#include <sstream>
#include <inttypes.h>
using namespace std;
int main (void) {
istringstream iss("123 42");
int8_t x;
while (iss >> x) {
cout << x << endl;
}
return 0;
}
生产:
1
2
3
4
2
但我想要:
123
42
强制转换iss >> (int)x
(我最初用char
尝试过这个(给了我">错误:二进制表达式('istringstream'(又名'basic_istringstream'(和'int'(的无效操作数"(clang(或">错误:'运算符'的不明确重载'运算符>>'"(g++(。
有没有办法将值作为数字直接读取到 8 位类型中,还是必须使用中间存储?
没有内置的 8 位类型;您正在使用别名进行signed char
,当您将格式化输入到任何类型的char
时,IOStreams 将始终提取单个 ASCII 字母。
所以,是的,使用中间存储,或者int8_t
包装在一个新的类中,该类为格式化的I/O提供自己的重载(除非你有严格的内存和/或性能要求,否则我认为这是矫枉过正的(。
(您的iss >> (int)x
尝试非常混乱;转换用于您将要获取其值的表达式,而不是用于要设置其值的 lvalues 命名对象。
您必须使用中间类型或自己进行解析。所有字符类型(字符、有符号字符和无符号字符(都被视为文本元素,而不是整数。int8_t可能只是其中一个的 typedef,这就是您的代码失败的原因。
注意:
- 输出将遇到相同的问题。
- 不要使用 C 样式转换,它们几乎只会导致错误。
- 在输入操作之前检查 EOF 是无用的,您需要在之后检查失败。
根本问题是int8_t
通常是(显然包括您的情况(是这样的:typedef char int8_t;
.无论好坏,iostreams 都为假定内容是字符而不是数字的char
提供了重载。
避免这种情况,例如通过定义自己的类,例如:
class my_int8_t {
// ...
};
在这种情况下,您可以为该类型提供自己的重载operator>>
和operator<<
(将内容视为数字而不是字符(。
一旦有了这个,将数据从输入复制到输出(每行一个数字(可能更好,如下所示:
std::copy(std::istream_iterator<my_int8_t>(std::cin),
std::istream_iterator<my_int8_t>(),
std::ostream_iterator<my_int8_t>(std::cout, "n"));
除此之外,这避免了当前代码中正确检测文件末尾的问题。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
typedef unsigned char uint8_t;
class exstringstream : public stringstream
{
public:
exstringstream(const string& s)
:stringstream(s)
{
}
friend exstringstream& operator >> (exstringstream&, uint8_t& t);
};
exstringstream& operator >> (exstringstream& ss, uint8_t& t)
{
unsigned int val;
stringstream& s = ss;
s >> val;
t = static_cast<uint8_t>(val);
return ss;
}
int main()
{
string str("123 45");
exstringstream ss(str);
uint8_t a, b;
ss >> a >> b;
cout << a << " " << b << endl;
return 0;
}
运算符无法区分字符类型和 8 位有符号/无符号整数类型,因为它们与从语言中看到的相同(如其他答案中所述(,这意味着您也无法实现支持两者的类/运算符。
如果你两者都需要,你被迫使用格式"hhu"
的scanf/printf
,或从<cinttypes>
PRIu8
:
https://www.cplusplus.com/reference/cinttypes/
https://www.cplusplus.com/reference/cstdio/printf/
- 在一个模板函数中,若输入的类型是enum类,我该如何使用std::underlying_type
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 当我输入字符类型的数字时,为什么我无法获得整数?
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 需要有关运行具有输入类型的编译器的帮助
- 如何在 CPP 中检查给定输入的数据类型?
- 将空格作为单字符数据类型的输入?
- 在函数中使用运算符重载,在 c++ 中使用 const 类型输入参数
- 有没有办法将输入类型包装到C++中的模板类?
- 如果输入类型与目标类型不同,"cin"变量是否重置为某个默认值?
- 函数重载并根据相同的输入返回不同的数据类型
- C++ 从用户那里获取未知数据类型输入
- C 异质容器,作为类型输入
- 如何在无效的数据类型输入后继续循环
- WSDLPull 使用复杂类型输入
- 使用std::cin (c++)检查有效的类型输入
- 为已定义的变量传递错误的类型输入
- 如何验证数据类型输入
- c++中的混合数据类型输入