我想解析一个文件并使用std::stringstream
来解析其内容。我使用get()
逐个字符地读取它,产生std::stringstream::int_type
。现在在某些情况下,我想使用查找表将ascii字符转换为其他值(例如,为了确定标识符中是否允许某个字符)。
现在我可以假设我从get()
获得的值是非负数,除非它是std::stringstream::traits_type::eof()
吗? (因此将它们用作查找表的索引)。
我在标准中找不到任何关于这一点的内容,这可能是由于我不了解整个字节到字符的事情在C ++中是如何工作的。
答案 0 :(得分:1)
首先让我们看一下basic_stringstream的更一般情况。
你不能假设eof()
是负数(我看到约束无处,C标准状态宏WEOF的值可能与EOF的值不同,不一定是负数。 )
一般来说,int_type
来自特质参数,字符特征的int_type
描述并不强制要求to_int_type
返回正面的内容。
现在,stringsteam
为basic_stringstream<char>
,因此使用char_traits<char>
; eof
是否定的,但我还没有找到to_int_type
对非负值的授权(它不是在21.2.3.1中,我认为无法从其他方面推断出来)约束),但我想知道我是否错过了一些东西,因为我的期望是to_int_type(c)
必须等同于(int)(unsigned char)c
- 这是GNU标准C ++库的情况,我有点希望得到相同的C中的行为,其中在int
中获取或返回字符的函数返回字符的非负值。)
有关信息,char_traits
的其他标准专业:
char_traits<char16_t>
和char_traits<char32_t>
有一个未签名int_type
,所以即使eof()
也是肯定的;
char_traits<wchar_t>::to_int_type
也未被要求为非eof()
输入返回正值(但与char_traits<char>
相比,我并不期望这样的任务在那里。