Namespaces
Variants

std::basic_streambuf<CharT,Traits>:: overflow

From cppreference.net
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 영역 (공식적으로, pbase() 가 null이면 빈 시퀀스, 그렇지 않으면 pptr ( ) - pbase ( ) 개의 문자로 pbase() 에서 시작).
    • 문자 ch 또는 ch가 EOF인 경우 아무것도 없음 (공식적으로, Traits :: eq_int_type ( ch, Traits :: eof ( ) ) true 를 반환하면).
  • 소비 후, put 영역 포인터들은 남아 있는 문자가 있는 경우 이를 보유하도록 갱신됩니다. 공식적으로, r 을 대기 중인 시퀀스에서 소비되지 않은 문자의 수라고 하면:
    • 만약 r 이 0이 아니면, pbase() pptr() 은 다음 조건들을 모두 만족하도록 설정됩니다:
      • pptr ( ) - pbase ( ) r 입니다.
      • pbase() 에서 시작하는 r 개의 문자는 연관된 출력 스트림에 속합니다.
    • 만약 r 이 0이면 (대기 중인 시퀀스의 모든 문자가 소비됨), pbase() 이 null 값으로 설정되거나, pbase() pptr() 이 모두 동일한 non-null 값으로 설정됩니다.
  • 이 함수는 연관된 출력 스트림에 일부 문자를 추가하는 데 실패하거나 위 규칙에 따라 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 멤버 함수)