2009-02-07 3 views
4

교육적인 이유로 C++ ostream을 만들려고합니다. 내 테스트는 ofstream과 같은 역할을하는 ostream을 만들 것입니다. deque 또는 vector 컨테이너에 쓸 파일에 쓰는 것 외에는 예외입니다.ostream 만들기

+2

아마도 실제 질문을하기 위해 질문을 개선 할 수 있습니다. –

답변

10

를이 교육이기 때문에, 당신이 말한대로, 나는 그런 말았을 것입니다 방법을 보여줍니다. 그렇지 않으면 stringstream이 실제로가는 길입니다.

벡터/deque에 쓰는 streambuf 구현을 만들고 싶습니다. (targeted a /dev/null stream 그 날의 다른 답변에서 복사) 이런 식으로 뭔가 :

template<typename Ch, typename Traits = std::char_traits<Ch>, 
     typename Sequence = std::vector<Ch> > 
struct basic_seqbuf : std::basic_streambuf<Ch, Traits> { 
    typedef std::basic_streambuf<Ch, Traits> base_type; 
    typedef typename base_type::int_type int_type; 
    typedef typename base_type::traits_type traits_type; 

    virtual int_type overflow(int_type ch) { 
     if(traits_type::eq_int_type(ch, traits_type::eof())) 
      return traits_type::eof(); 
     c.push_back(traits_type::to_char_type(ch)); 
     return ch; 
    } 

    Sequence const& get_sequence() const { 
     return c; 
    } 
protected: 
    Sequence c; 
}; 

// convenient typedefs 
typedef basic_seqbuf<char> seqbuf; 
typedef basic_seqbuf<wchar_t> wseqbuf; 

당신은 다음과 같이 사용할 수 있습니다 :

seqbuf s; 
std::ostream os(&s); 
os << "hello, i'm " << 22 << " years old" << std::endl; 
std::vector<char> v = s.get_sequence(); 

당신이 순서로 양단 큐를 원한다면, 당신은 그렇게 할 수 있습니다 :

typedef basic_seqbuf< char, char_traits<char>, std::deque<char> > dseq_buf; 

또는 이와 비슷한 ... 글쎄 테스트하지 않았습니다. 그러나 그것은 또한 좋은 일이기도합니다. 버그가 아직 포함되어 있다면, 버그를 고칠 수 있습니다.

+1

코드 스 니펫을 보내 주셔서 감사합니다. 동일한 접근 방식을 사용하여 출력을 비활성화하려면 http://stackoverflow.com/questions/760301/implementing-a-no-op-stdostream/3261439#3261439를 사용하는 것이 좋지만 문자 단위 처리를 수행하는 것이 가장 적합한 지 궁금합니다 (' overflow'는 한 번에 하나의 char을 취합니다) 또는'basic_streambuf :: sputn (const char * s, streamsize n)'과 교차하는 방법이 있습니까? –

4

를 사용하여 표준 : : 이제 stringstream

#include <iostream> 
#include <sstream> 
int main() 
{ 
    std::stringstream s; 
    s << "Plop" << 5; 

    std::cout << s.str(); 
} 
1
당신이 너무 구체적으로 어렵다 수행 할 작업에 대한 자세한 사항없이

하지만 새 ostream에를 생성하고 싶지 않아요. 당신이 원하는 것은 새로운 타입의 streambuf를 생성하고 기존의 ostream을 사용하는 것입니다.

쉽게 할 일은 std :: basic_filebuf <>에서 상속하고 데이터 구조에 요소를 추가하기 위해 sync() 및 overflow() 메서드를 오버로드하는 것입니다.

2

여러분은 ostream과 같은 클래스를 작성할 필요가 없다는 점에 주목할 것입니다. 어댑터를 사용하여 목표를 달성 할 수 있습니다.

는 예를 들어,이 코드는 istream로부터 읽고 벡터에 각 요소를 삽입합니다

vector<string> V; 
copy(istream_iterator<string>(cin), 
    istream_iterator<string>(), 
    back_inserter(V)); 
관련 문제