关于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,所以计数器没有被递加,因此在产生了区别。

     

posted @ 2012-10-22 08:54  SA高处不胜寒  阅读(859)  评论(0编辑  收藏  举报