这个问题是关于basic_istream
的成员函数:
int_type get();
如N3337 27.7.2.3#4(即[istream.unformatted])所述。据推测,实际的标准文本是相同的。
案文说:
构建一个岗哨对象后,提取一个角色
c
(如果有的话)返回:
c
如果可用,否则traits::eof()
本文建议否定char
s应返回负值。我们可以与下一部分basic_istream<charT,traits>& get(char_type &c)
进行比较,后面写着:
构建哨兵对象后,提取一个角色(如果有),并将其分配给
c
。
这与get()
非常相似。
但是,当我尝试get()
时,负字符会返回正值;即basic_istream::get()
的行为类似于C函数getchar()
。这将是明智的行为(允许发出EOF信号),但标准文本似乎没有指明这一点。 getchar()
和朋友的C99描述明确说明它返回值转换为unsigned char 。但basic_istream::get()
没有任何等效文本。
我的问题是:get()
是否需要指定返回0...UCHAR_MAX
union EOF
范围内的值?或者它应该将实际char
转换为int_type
(通过隐式转换)吗?或者是其他东西?标准究竟在这里指定了什么和不是什么?
如果&#34;其他&#34;,如何转换int i = cin.get()
的结果以匹配char ch; cin.get(ch);
为同一输入字符读取的字符值?
答案 0 :(得分:3)
为了澄清你的困惑,差异并不重要。想想你能够或不能参与无参数get()
的回报值。有趣的是,你无法将其与EOF
或traits_type::eof()
进行可靠的比较,因为它并不能保证具有可比性等级( 虽然内置char
和wchar_t
。为了正确比较,您只需使用traits_type::eq_int_type()
。同样,为了在检查EOF后从中提取字符,使用traits_type::to_char_type()
,然后该函数相应地转换类型。同样,get()
无法使用隐式转化,但必须使用traits_type::to_int_type()
。
总之,getchar()
保证它返回&#34; unsigned&#34;值或EOF不是必需的,因为traits_type
封装了这些知识,应该用于正确的代码。
无参数istream :: get()的使用示例:
traits_type::int_type c = in.get();
if(traits_type::not_eof(c))
my_string += traits_type::to_char_type(c);
类似使用单参数istream :: get():
traits_type::char_type c;
in.get(c);
if(in) // check for EOF or other input failure
my_string += c;
答案 1 :(得分:2)
根据[char.traits.typedefs]
typedef INT_T int_type;
要求:对于某个字符容器类型
char_type
,相关 容器类型INT_T
应该是可以代表所有容器的类型或类 从相应的char_-type
转换的有效字符数 值,以及文件结束值eof()
。类型int_type
表示可以保存文件结尾的字符容器类型 用作iostream类成员函数的返回类型。
标准的唯一要求是int_type
足以容纳char_type
的所有值(它甚至不必是基本类型),加上值由eof()
返回,但该标准还要求char_traits<char>::int_type
为int
,而char_traits<wchar_t>
为wint_t
。
您看到char
转换为无符号值的原因是因为GCC确保EOF
和字符值0xff
在{{1在返回char_traits<char>::to_int_type
之前将字符转换为unsigned char
(请注意,标准还要求int
返回char_traits<char>::eof
,EOF
表示WEOF
}})。如果没有强制转换wchar_t
,则会将符号扩展为等效0xff
,至少对于GCC而言。
至于将EOF
的返回值(甚至是隐式)转换为get
,由于它处理signed conversion的方式,这适用于GCC。
将整数转换为a的结果或产生的信号 当值无法在对象中表示时,有符号整数类型 该类型(C90 6.2.1.2,C99和C11 6.3.1.3)。
转换为 宽度为N的类型,该值以2 ^ N的模数减小到范围内 类型;没有信号被提出。
这不是便携式的,你应该首先在返回值上使用char
(当然在检查traits_type::to_char_type
/ EOF
之后......)。< / p>