std::basic_streambuf<CharT,Traits>:: overflow
|
protected
:
virtual int_type overflow ( int_type ch = Traits :: eof ( ) ) ; |
||
이 함수의 의도는 스트림 버퍼의 put area 에서 associated character sequence 로 문자를 전송하는 것입니다.
공식적으로, 이 함수는 put 영역에 최소한 하나의 문자를 위한 공간이 있도록 보장합니다. 기본 클래스 버전은 항상 실패하며, 성공 가능한 구현은 파생 클래스에서만 제공될 수 있습니다 ( 구현 요구사항 참조). 표준 라이브러리는 std::strstreambuf::overflow() , (C++26까지) std::basic_stringbuf::overflow() 및 std::basic_filebuf::overflow() 를 제공합니다.
목차 |
매개변수
| ch | - | put 영역에 저장할 문자 |
반환값
Traits :: eof ( )
구현 요구사항
이 가상 함수의 모든 재정의(override) 정의는 다음 제약 조건을 반드시 준수해야 하며, 그렇지 않을 경우 동작은 정의되지 않습니다:
- 이 함수의 효과는 대기 중인 시퀀스(pending sequence) 의 문자들 중 일부 초기 부분 시퀀스를 소비하는 것입니다. 대기 중인 시퀀스는 다음 시퀀스들의 연결로 정의됩니다:
- 소비 후, put 영역 포인터들은 남아 있는 문자가 있는 경우 이를 보유하도록 갱신됩니다. 공식적으로, r 을 대기 중인 시퀀스에서 소비되지 않은 문자의 수라고 하면:
- 이 함수는 연관된 출력 스트림에 일부 문자를 추가하는 데 실패하거나 위 규칙에 따라 pbase() 과 pptr() 을 설정할 수 없는 경우 실패할 수 있습니다.
- 함수가 성공하면, Traits :: eof ( ) 이 아닌 값을 반환합니다. 일반적으로, 성공을 나타내기 위해 ch 이 반환되지만, Traits :: eq_int_type ( ch, Traits :: eof ( ) ) 이 true 를 반환하는 경우에는 Traits :: not_eof ( ch ) 이 반환됩니다.
- 함수가 실패하면, Traits :: eof ( ) 을 반환하거나 예외를 throw합니다.
참고
sputc() 와 sputn() 은 오버플로우 발생 시 ( pptr ( ) == nullptr 또는 pptr ( ) >= epptr ( ) ) 이 함수를 호출합니다.
예제
#include <array> #include <cstddef> #include <iostream> // std::array로 구현된 std::ostream용 버퍼 template<std::size_t size, class CharT = char> struct ArrayedStreamBuffer : std::basic_streambuf<CharT> { using Base = std::basic_streambuf<CharT>; using char_type = typename Base::char_type; using int_type = typename Base::int_type; ArrayedStreamBuffer() { // 'buffer'와 작업하기 위한 put 영역 포인터 설정 Base::setp(buffer.data(), buffer.data() + size); } int_type overflow(int_type ch) { std::cout << "overflow\n"; return Base::overflow(ch); } void print_buffer() { for (char_type i : buffer) { if (i == 0) std::cout << "\\0"; else std::cout << i; std::cout << ' '; } std::cout << '\n'; } private: std::array<char_type, size> buffer{}; // 값 초기화된 버퍼 }; int main() { ArrayedStreamBuffer<10> streambuf; std::ostream stream(&streambuf); stream << "hello"; streambuf.print_buffer(); if (stream.good()) std::cout << "stream is good\n"; stream << "world"; streambuf.print_buffer(); if (stream.good()) std::cout << "stream is good\n"; stream << "!"; streambuf.print_buffer(); if (!stream.good()) std::cout << "stream is not good\n"; }
출력:
h e l l o \0 \0 \0 \0 \0 stream is good h e l l o w o r l d stream is good overflow h e l l o w o r l d stream is not good
참고 항목
|
[virtual]
|
연결된 입력 시퀀스에서 문자를 읽어 get 영역으로 가져오고 다음 포인터를 전진시킴
(가상 protected 멤버 함수) |
|
[virtual]
|
연결된 입력 시퀀스에서 문자를 읽어 get 영역으로 가져옴
(가상 protected 멤버 함수) |
|
[virtual]
|
put 영역에서 연결된 파일로 문자를 기록함
(
std::basic_filebuf<CharT,Traits>
의 가상 protected 멤버 함수)
|
|
[virtual]
|
출력 시퀀스에 문자를 추가함
(
std::basic_stringbuf<CharT,Traits,Allocator>
의 가상 protected 멤버 함수)
|
|
[virtual]
|
출력 시퀀스에 문자를 추가하며, 동적이고 고정되지 않은 경우 버퍼를 재할당하거나 초기 할당할 수 있음
(
std::strstreambuf
의 가상 protected 멤버 함수)
|