Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::basic_stringbuf<CharT,Traits,Allocator>::underflow

      From cppreference.com
      <cpp‎ |io‎ |basic stringbuf
       
       
       
       
      protected:
      virtual int_type underflow()

      Reads the next character from the get area of the buffer.

      Specifically:

      1) If the input sequence has a read position available (egptr()> gptr()), returnsTraits::to_int_type(*gptr())
      2) Otherwise, ifpptr()> egptr() (some characters were inserted into the stream since the last timeoverflow() changedegptr()) then extends the end of the get area to include the most recently inserted characters, by changingegptr() to equalpptr(), and then returnsTraits::to_int_type(*gptr())
      3) Otherwise, returnsTraits::eof().

      Any character in the buffer which has been initialized, regardless of whether it originated from the string passed in the constructor or was appended byoverflow(), is considered to be part of the input sequence.

      Contents

      [edit]Parameters

      (none)

      [edit]Return value

      Traits::to_int_type(*gptr()) (the next character to read in the get area) in case of success, orTraits::eof() in case of failure.

      [edit]Example

      Run this code
      #include <iostream>#include <sstream> struct mybuf:std::stringbuf{    mybuf(conststd::string& new_str,std::ios_base::openmode which=std::ios_base::in|std::ios_base::out):std::stringbuf(new_str, which){}     int_type overflow(int_type c){std::cout<<"Before overflow():  get area size is "<< egptr()- eback()<<", the put area size is "<< epptr()- pbase()<<'\n';        int_type rc= std::stringbuf::overflow(c);std::cout<<"After overflow():   get area size is "<< egptr()- eback()<<", put area size is "<< epptr()- pbase()<<'\n';return rc;}     int_type underflow(){std::cout<<"Before underflow(): get area size is "<< egptr()- eback()<<", put area size is "<< epptr()- pbase()<<'\n';        int_type ch= std::stringbuf::underflow();std::cout<<"After underflow():  get area size is "<< egptr()- eback()<<", put area size is "<< epptr()- pbase()<<'\n'; if(ch==EOF)std::cout<<"underflow() returns EOF\n";elsestd::cout<<"underflow() returns '"<<char(ch)<<"'\n";return ch;}}; int main(){    mybuf sbuf("123");// read-write streamstd::iostream stream(&sbuf);int n;    stream>> n;// calls sgetc() four times// three calls return the characters '1', '2', '3'// the fourth call, gptr() == egptr() and underflow() is called// underflow returns EOFstd::cout<<"n = "<< n<<'\n';    stream.clear();// clear the eofbit     stream<<"123456";// sputc() is called 6 times// first three calls store "123" in the existing buffer// 4th call finds that pptr() == epptr() and calls overflow()// overflow() grows the buffer and sets egptr() to 4// 5th and 6th calls store '5' and '6', advancing pptr()     stream>> n;// calls sgetc() 4 times// 1st call returns the '4' that was made available by overflow()// on the 2nd call, egptr() == egptr() and underflow() is called// underflow advances egptr() to equal pptr() (which is 6)// 3rd sgetc() returns '6'// 4th sgetc() finds gptr() == egptr(), calls underflow()// underflow() returns EOF std::cout<<"n = "<< n<<'\n';}

      Possible output:

      Before underflow(): get area size is 3, put area size is 15After underflow():  get area size is 3, put area size is 15underflow() returns EOFn = 123Before underflow(): get area size is 3, put area size is 15After underflow():  get area size is 6, put area size is 15underflow() returns '4'Before underflow(): get area size is 6, put area size is 15After underflow():  get area size is 6, put area size is 15underflow() returns EOFn = 456

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      LWG 432C++98it was unclear whether characters appended byoverflow()
      are considered to be part of the input sequence
      made clear

      [edit]See also

      [virtual]
      reads characters from the associated input sequence to the get area
      (virtual protected member function ofstd::basic_streambuf<CharT,Traits>)[edit]
      [virtual]
      reads from the associated file
      (virtual protected member function ofstd::basic_filebuf<CharT,Traits>)[edit]
      [virtual]
      reads a character from the input sequence without advancing the next pointer
      (virtual protected member function ofstd::strstreambuf)[edit]
      reads one character from the input sequence without advancing the sequence
      (public member function ofstd::basic_streambuf<CharT,Traits>)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/io/basic_stringbuf/underflow&oldid=148336"

      [8]ページ先頭

      ©2009-2025 Movatter.jp