2

我想解析一个文件并使用一个std::stringstream来解析它的内容。我get()习惯一个字符一个字符地阅读它,这会产生一个std::stringstream::int_type. 现在在某些情况下,我想使用查找表将 ascii 字符转换为其他值(例如,确定标识符中是否允许某个字符)。

现在我可以假设我得到的值get()是非负的,除非它是std::stringstream::traits_type::eof()?(因此将它们用作查找表的索引)。

我在标准中找不到任何关于此的内容,这可能是由于我对整个字节到字符的事情在 C++ 中的工作方式缺乏了解。

4

1 回答 1

1

首先让我们看一下 basic_stringstream 的更一般的情况。

您不能假设它eof()是负数(我看不到任何地方的约束,并且 C 标准状态宏 WEOF 的值可能与 EOF 的值不同,不必为负数。

一般来说,int_type来自 trait 参数,并且int_type对于字符特征的描述并不要求to_int_type返回积极的东西。

现在,stringsteambasic_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>有一个 unsigned int_type,所以 eveneof()是正数;

  • char_traits<wchar_t>::to_int_type也没有强制要求为非输入返回正值eof()(但与char_traits<char>我没想到会有这样的要求相反)。

于 2013-06-11T11:24:41.433 回答