这个:
#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
)给了我“ error :无效的操作数到二进制表达式('istringstream'(又名'basic_istringstream')和'int')" (clang) or " error :'运算符>>'(g)的模糊重载 .
有没有办法将值直接读入 8-bit 类型,或者我是否必须使用中间存储?
4 回答
您必须使用中间类型或自己进行解析 . 所有char类型(char,signed char和unsigned char)都被视为文本元素,而不是整数 . int8_t可能只是其中一个的typedef,这就是你的代码失败的原因 .
注意:
输出将遇到相同的问题 .
不要使用C风格的强制转换,它们几乎只会导致错误 .
在输入操作无效之前检查EOF,您需要在之后检查故障 .
没有内置的8位类型;您正在使用
signed char
的别名,当您将输入格式化为任何类型的char
时,IOStreams将始终提取单个ASCII字母 .所以,是的,使用中间存储,或将
int8_t
包装在为格式化I / O提供其自身重载的新类中(除非您有严格的内存和/或性能要求,否则我认为这是过度杀戮) .(您对
iss >> (int)x
的尝试非常困惑;转换用于您将要获取值的表达式,而不是用于命名要设置值的对象的左值 . )根本问题是
int8_t
通常(显然包括你的情况)类似于:typedef char int8_t;
. 无论好坏,iostream都会为char
提供重载,假设内容是字符而不是数字 .可以避免这种情况,例如通过定义自己的类,例如:
在这种情况下,您可以为该类型提供自己的
operator>>
和operator<<
重载(将内容视为数字而不是字符) .一旦你有了这个,将数据从输入复制到输出(每行一个数字)可能更好地完成如下:
其中,这可以避免当前代码中的问题,即正确检测文件结尾 .