我的代码使用std::streambuf::sgetc()和std::streambuf::sbumpc()逐个字符读取文件字符。这些函数返回一个int类型值,如果有,该值表示读取字符,如果到达文件末尾,则返回EOF。EOF是实现定义的,在大多数实现中是-1。
我能否确保每当读取字符(即如果返回的值不是-1)时,返回的值就在0的范围内。255?
发布于 2018-05-04 21:31:47
标准不能保证这一点,但假设结果将是有效的char,您可能会很好,因为每个人都是这样做的。
如果您想完全确定,请使用std::char_traits::to_char_type将其转换回char。然后,标准保证接收原始值,该值适合于char。
std::streambuf本质上是std::basic_streambuf>的捷径。sbumpc()和sgetc()返回的整数类型是该特性类的int_type。
标准在[char.traits.type/2]中要求
对于某个字符容器类型
char_type,相关容器类型INT_T应该是可以表示从相应的char_type值转换的所有有效字符的类型或类,以及文件结束值eof()。类型int_type表示一个字符容器类型,它可以保存文件结束,用作iostream类成员函数的返回类型。
基本上,int_type需要保存所有可能的字符,以及EOF的单独值。
下面是如何在std::streambuf中定义[streambuf.pub.get]成员函数
int_type sbumpc();返回:如果输入序列读取位置不可用,则返回uflow()。否则,返回traits::to_int_type(*gptr())并增加输入序列的下一个指针。
int_type sgetc();
返回:如果输入序列读取位置不可用,则返回underflow()。否则,返回traits::to_int_type(*gptr())。
最终,这取决于您的标准库是如何实现std::char_traits<char>::to_int_type的,而标准在这方面几乎没有什么需求(参见[char.traits.require]中的表56 )。至少从理论上讲,字符被映射到原始字符的范围之外是可能的。
但是,我不知道有任何库实现会这样做--大多数库只是使用更大的整数类型,这样它们就可以为EOF返回-1,但是将所有字符保持不变(这也可能是实现这一点的最有效方法)。有一个原因是cppreference.com 显式提及
char_traits<char>::eof()的一个常见实现是return -1,相应的有效实现char_traits<char>::to_int_type(c)是return (unsigned char)c。
我检查了一下,stdlibc++和libc++都是这样做的。不幸的是,我无法检查MSVC,但我希望他们会做一些类似的事情。
https://stackoverflow.com/questions/50182804
复制相似问题