istream :: get()的返回值

时间:2014-06-30 03:54:35

标签: c++ language-lawyer

这个问题是关于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);为同一输入字符读取的字符值?

2 个答案:

答案 0 :(得分:3)

为了澄清你的困惑,差异并不重要。想想你能够或不能参与无参数get()的回报值。有趣的是,你无法将其与EOFtraits_type::eof()进行可靠的比较,因为它并不能保证具有可比性等级( 虽然内置charwchar_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_typeint,而char_traits<wchar_t>wint_t

您看到char转换为无符号值的原因是因为GCC确保EOF和字符值0xff在{{1在返回char_traits<char>::to_int_type之前将字符转换为unsigned char(请注意,标准还要求int返回char_traits<char>::eofEOF表示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>