std::basic_stringbuf<CharT,Traits,Allocator>:: underflow
|
protected
:
virtual int_type underflow ( ) |
||
버퍼의 get 영역에서 다음 문자를 읽습니다.
구체적으로:
버퍼 내에서 초기화된 모든 문자는, 생성자에 전달된 문자열에서 비롯되었는지 또는 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 멤버 함수)
|