C++ 使用 istringstream 将整数读取为无符号字符
Posted
技术标签:
【中文标题】C++ 使用 istringstream 将整数读取为无符号字符【英文标题】:C++ Reading ints as unsigned chars using istringstream 【发布时间】:2015-11-18 16:48:47 【问题描述】:当使用 std::istringstream
从文件 (0-255) 读取灰度像素值时,我注意到一个奇怪的行为,我无法理解发生了什么。
为了节省内存,我想将这些值读入无符号字符(因为它们具有相同的 0-255 范围)。但是,似乎正在进行某种类型的转换/截断。
输入文件:
194
194
155
155
124
194
这是我的代码:
getline(fp, line);
unsigned char temp;
istringstream iss(line);
iss >> temp;
当文件中的值为194
时,例如temp的整数值为49
...
正在进行什么类型的投射?
【问题讨论】:
您可以使用未格式化的输入:std::istream::get
表示字节。
问题不是修复代码,而是发生了哪种类型的转换/截断?
请更清楚您的输入数据。目前我们只能猜测它的格式,因为“从文件中读取值”实际上什么也没告诉我们!我的猜测是通过 ASCII 以人类可读的十进制表示的 0
/OT @LightnessRacesinOrbit 看来我又老又跛了 ;-) ...
【参考方案1】:
没有强制转换,这种行为是由于重载造成的。
std::basic_istream::operator>>
恰好被 char
类型重载,一次只提取一个字符 - 1
,其 ASCII 值是 49
。这是您想要的行为,当您读取单个字符并且假设您在提取到字符类型时正是想要的。
要将文本读取为以空格分隔的数字,您必须使用更大的类型进行提取,例如unsigned short
或 std::uint16_t
然后转换为 unsigned char
。
【讨论】:
谢谢!这就是我一直在寻找的答案! 你不妨在投之前检查一下值是否在unsigned char
的范围内。
转换为unsigned char
是明确定义的,因此无需进行检查,除非您想对意外值进行特殊处理
我的意思是你想处理你阅读257
的情况,并以1
结束。以上是关于C++ 使用 istringstream 将整数读取为无符号字符的主要内容,如果未能解决你的问题,请参考以下文章
c++中istringstream及ostringstream超详细说明
在 C++ 中使用 istringstream 进行字符串到双重转换的意外结果