关于cin.gcount()的问题[转]
-
请问以下两段代码输出为什么会不同?
代码1:
void main() { char a[10]; cin.getline(a,10); //输入"123456789" cout << a << endl; //输出"123456789" cout << cin.gcount(); //输出10 }
代码2:
void main() { char a[10]; cin.getline(a,10); //输入"1234567890" cout << a << endl; //输出"123456789" cout << cin.gcount(); //输出9 }
我知道cin.getline()会自动加入结束符,所以第二次输入中,最后的0不会被接受,但应该对cin.gcount()没什么影响的啊~
为什么两次输入得到的结果会不同?(值得强调的是: '\0' != '\n')
-
getline()是按行读入字符串,后面可以指定2个参数或3个参数,其在istream中的实现如下
_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str, streamsize _Count)
{ // get up to _Count characters into NTCS, discard newline
return (getline(_Str, _Count, _Myios::widen('\n')));
}
可以看出,两个参数的getline()实际也是调用了以'\n'为结束符的三参数getline()函数。
同时当我们单步进入getline()的实现我们会发现这样的判断语句
if (_Ok && 0 < _Count)
{ // state okay, use facet to extract
int_type _Metadelim = _Traits::to_int_type(_Delim);
_TRY_IO_BEGIN
int_type _Meta = _Myios::rdbuf()->sgetc(); //从输入流读一个字符
for (; ; _Meta = _Myios::rdbuf()->snextc())
if (_Traits::eq_int_type(_Traits::eof(), _Meta))
{ // end of file, quit
_State |= ios_base::eofbit; //遇到文件尾,getline结束
break;
}
else if (_Meta == _Metadelim)
{ // got a delimiter, discard it and quit
++_Chcount;
_Myios::rdbuf()->sbumpc(); //这句把结束符读掉了,如果不指定结束符,那就是把'\n'读掉了
break;
} //遇到结束符,getline结束,注意这里的顺序,它是先判断是否遇到结束符,后判断是否读入了指定个数的。在这里计数器仍然执行++
else if (--_Count <= 0)
{ // buffer full, quit
_State |= ios_base::failbit;
break;
} //读到了指定个数,执行到这里已经隐含了在指定个数的最后一位仍然不是结束符,由于这执行这部分时,在对长度计数器没有进行++操作
else
{ // got a character, add it to string
++_Chcount;
*_Str++ = _Traits::to_char_type(_Meta);
}
_CATCH_IO_END
}
所以在对于输入12345789时,在最后我们输入了’\n’,因此在判断时,计数器仍然加1,而相对当我们输入1234567890时,在判断a[9]时,由于--_Count <= 0,所以计数器没有被递加,因此在产生了区别。