创造一个ostream

时间:2009-02-07 20:32:31

标签: c++ std ostream

出于教育原因,我正在尝试创建一个c ++ ostream。我的测试将创建一个像流一样的ostream,除了写入一个文件,它将写入双端队列或向量容器。

4 个答案:

答案 0 :(得分:11)

正如你所说的那样,我会告诉你我将如何做这样的事情。否则,stringstream真的是要走的路。

听起来你想要创建一个streambuf实现,然后写入vector / deque。这样的事情(从我的另一个答案中复制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();

如果你想要一个deque作为序列,你可以这样做:

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

或类似的东西......好吧,我没有测试过它。但也许这也是一件好事 - 所以如果它仍然包含bug,你可以尝试修复它们。

答案 1 :(得分:4)

使用std :: stringstream

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

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

答案 2 :(得分:2)

我只是说你不必为此写一个类似ostream的类。您可以使用适配器来实现目标。

例如,此代码从istream读取并将每个元素插入到向量中:

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

答案 3 :(得分:1)

如果没有关于你想做什么的更多细节,很难过于具体,但你不想创建一个新的ostream。你想要做的是创建一个新类型的streambuf,并使用现有的ostream。

最简单的方法是从std :: basic_filebuf&lt;&gt;继承,并重载sync()和overflow()方法以向数据结构中添加元素。