首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >范围::streambuf::sgetc

范围::streambuf::sgetc
EN

Stack Overflow用户
提问于 2018-05-04 20:43:28
回答 1查看 185关注 0票数 0

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

我能否确保每当读取字符(即如果返回的值不是-1)时,返回的值就在0的范围内。255?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,但我希望他们会做一些类似的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50182804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档