문제

나는 교육적 이유로 C ++ 타조를 만들려고 노력하고 있습니다. 내 테스트는 파일에 쓰는 것을 제외하고는 Deque 또는 벡터 컨테이너에 쓰는 것을 제외하고는 Ofstream처럼 작용하는 타조를 만드는 것입니다.

도움이 되었습니까?

해결책

교육을위한 것처럼, 당신이 말했듯이, 나는 내가 그런 일을 어떻게 할 것인지 보여줄 것입니다. 그렇지 않으면, stringstream 정말로가는 길입니다.

StreamBuf 구현을 만들고 싶은 것처럼 벡터 / deque에 씁니다. 이와 같은 것 (내 다른 대답에서 복사 대상 /dev /null 스트림):

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;

또는 비슷한 ... 글쎄, 나는 그것을 테스트하지 않았다. 그러나 아마도 그것은 또한 좋은 일일 수도 있습니다. 따라서 여전히 버그가 포함되어 있다면 고칠 수 있습니다.

다른 팁

std :: stringstream을 사용하십시오

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

    std::cout << s.str();
}

나는 당신이 그것에 대해 타조와 같은 클래스를 쓸 필요가 없다는 것을 알 수 있습니다. 어댑터를 사용하여 목표를 달성 할 수 있습니다.

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

vector<string> V;
copy(istream_iterator<string>(cin), 
     istream_iterator<string>(), 
     back_inserter(V)); 

당신이하고 싶은 일에 대한 자세한 내용은 너무 구체적이기가 어렵지만 새로운 타조를 만들고 싶지는 않습니다. 당신이하고 싶은 것은 새로운 유형 StreamBuf를 만들고 기존 타조를 사용하는 것입니다.

쉬운 일은 std :: basic_filebuf <>에서 상속 받고 SYNC () 및 OVERFLOW () 메소드를 과부하시키는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top