Namespaces
Variants

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

From cppreference.net
protected :
virtual int_type underflow ( )

버퍼의 get 영역에서 다음 문자를 읽습니다.

구체적으로:

1) 입력 시퀀스에 읽기 위치가 사용 가능한 경우 ( egptr ( ) > gptr ( ) ), Traits :: to_int_type ( * gptr ( ) ) 를 반환합니다
2) 그렇지 않고 만약 pptr ( ) > egptr ( ) (마지막으로 overflow() egptr() 를 변경한 이후로 일부 문자가 스트림에 삽입됨)라면, 가장 최근에 삽입된 문자들을 포함하도록 get 영역의 끝을 확장합니다. egptr() pptr() 와 같도록 변경한 후, Traits :: to_int_type ( * gptr ( ) ) 를 반환합니다.
3) 그렇지 않으면, Traits :: eof ( ) 를 반환합니다.

버퍼 내에서 초기화된 모든 문자는, 생성자에 전달된 문자열에서 비롯되었는지 또는 overflow() 에 의해 추가되었는지 여부와 관계없이 입력 시퀀스의 일부로 간주됩니다.

목차

매개변수

(없음)

반환값

Traits :: to_int_type ( * gptr ( ) ) (get 영역에서 읽을 다음 문자)를 성공 시 반환하거나, Traits :: eof ( ) 를 실패 시 반환합니다.

예제

#include <iostream>
#include <sstream>
struct mybuf : std::stringbuf
{
    mybuf(const std::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";
        else
            std::cout << "underflow() returns '" << char(ch) << "'\n";
        return ch;
    }
};
int main()
{
    mybuf sbuf("123"); // 읽기-쓰기 스트림
    std::iostream stream(&sbuf);
    int n;
    stream >> n; // sgetc()를 네 번 호출
                 // 세 번의 호출은 '1', '2', '3' 문자를 반환
                 // 네 번째 호출에서 gptr() == egptr()이고 underflow()가 호출됨
                 // underflow는 EOF를 반환
    std::cout << "n = " << n << '\n';
    stream.clear(); // eofbit을 지움
    stream << "123456"; // sputc()가 6번 호출됨
                        // 처음 세 번의 호출은 기존 버퍼에 "123"을 저장
                        // 4번째 호출에서 pptr() == epptr()을 발견하고 overflow()를 호출
                        // overflow()는 버퍼를 확장하고 egptr()을 4로 설정
                        // 5번째와 6번째 호출은 '5'와 '6'을 저장하며 pptr()을 진행시킴
    stream >> n; // sgetc()를 4번 호출
                 // 1번째 호출은 overflow()에 의해 사용 가능해진 '4'를 반환
                 // 2번째 호출에서 egptr() == egptr()이고 underflow()가 호출됨
                 // underflow는 egptr()을 pptr()(6)과 같게 진행시킴
                 // 3번째 sgetc()는 '6'을 반환
                 // 4번째 sgetc()는 gptr() == egptr()을 발견하고 underflow()를 호출
                 // underflow()는 EOF를 반환
    std::cout << "n = " << n << '\n';
}

가능한 출력:

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

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 432 C++98 overflow() 에 의해 추가된 문자가
입력 시퀀스의 일부로 간주되는지 여부가 불분명했음
명확히 규정됨

참고 항목

[virtual]
연관된 입력 시퀀스에서 get 영역으로 문자를 읽어들임
( std::basic_streambuf<CharT,Traits> 의 virtual protected 멤버 함수)
[virtual]
연관된 파일에서 읽어들임
( std::basic_filebuf<CharT,Traits> 의 virtual protected 멤버 함수)
[virtual]
다음 포인터를 이동시키지 않고 입력 시퀀스에서 문자를 읽음
( std::strstreambuf 의 virtual protected 멤버 함수)
시퀀스를 이동시키지 않고 입력 시퀀스에서 한 문자를 읽음
( std::basic_streambuf<CharT,Traits> 의 public 멤버 함수)