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 shortstd::uint16_t 然后转换为 unsigned char

【讨论】:

谢谢!这就是我一直在寻找的答案! 你不妨在投之前检查一下值是否在unsigned char的范围内。 转换为unsigned char 是明确定义的,因此无需进行检查,除非您想对意外值进行特殊处理 我的意思是你想处理你阅读257的情况,并以1结束。

以上是关于C++ 使用 istringstream 将整数读取为无符号字符的主要内容,如果未能解决你的问题,请参考以下文章

C++中的 istringstream 的用法

c++中istringstream及ostringstream超详细说明

在 C++ 中使用 istringstream 进行字符串到双重转换的意外结果

C++ 中的流类型,如何从 IstringStream 中读取?

如何从字符串 C++ 中读取多个整数

istringstream将字符串放回输入并再次读取