C++ std::streambuf::sgetc的范围

C++ std::streambuf::sgetc的范围,c++,stl,C++,Stl,我的代码使用std::streambuf::sgetc和std::streambuf::sbumpc逐个字符读取文件。这些函数返回一个int类型的值,如果有,则表示读取字符;如果到达文件末尾,则返回EOF。EOF是实现定义的,在大多数实现中为-1 我是否可以确保,每当读取字符时,即如果返回值不是-1,则返回值在[0..255]范围内?标准不能保证这一点,但您可能可以假设结果是有效字符,因为每个人都是这样做的 如果您想绝对确定,请使用转换回字符。然后,标准保证您收到原始值,该值适合于字符 stre

我的代码使用std::streambuf::sgetc和std::streambuf::sbumpc逐个字符读取文件。这些函数返回一个int类型的值,如果有,则表示读取字符;如果到达文件末尾,则返回EOF。EOF是实现定义的,在大多数实现中为-1

我是否可以确保,每当读取字符时,即如果返回值不是-1,则返回值在[0..255]范围内?

标准不能保证这一点,但您可能可以假设结果是有效字符,因为每个人都是这样做的

如果您想绝对确定,请使用转换回字符。然后,标准保证您收到原始值,该值适合于字符

streambuf本质上是一种快捷方式。sbumpc和sgetc返回的整数类型是这个traits类的int_类型

该标准要求:

[f] 或某个字符容器类型char­type,相关容器类型INT­T应是一种类型或类,可表示从相应字符类型值转换而来的所有有效字符,以及文件结束值eof。int类型表示一种字符容器类型,它可以保存要用作iostream类成员函数返回类型的文件结尾

基本上,int_类型需要保存所有可能的字符,以及一个单独的EOF值

以下是如何在中定义std::streambuf成员函数:

int_型sbumpc

返回:如果输入序列读取位置不可用,则返回uflow。否则,返回traits​::​输入*gptr并增加输入序列的下一个指针

int_型sgetc

返回:如果输入序列读取位置不可用,则返回下溢。否则,返回traits​::​输入类型*gptr

归根结底,这取决于标准库如何实现std::char_traits::to_int_type,而该标准在这方面的要求很少,请参见中的表56。至少在理论上,字符映射到原始字符范围之外是可能的

然而,我不知道有哪种库实现能真正做到这一点——大多数库只使用一个更大的整数类型,这样它们就可以返回-1作为EOF,但保持所有字符不变——这可能也是实现这一点最有效的方法。cppreference.com认为

char_traits::eof的一个常见实现是return-1,char_traits::to_int_typec的一个对应有效实现是return unsigned charc


我检查了一下,stdlibc++和libc++都是这样做的。不幸的是,我无法检查MSVC,但我希望他们也能做类似的事情。

谢谢您的详细解释!