Pergunta

Eu estou tentando criar um ostream c ++ por motivos educacionais. Meu teste será a criação de um ostream que age como um ofstream iria exceto em vez de escrever em um arquivo que iria escrever para um deque ou vector recipiente.

Foi útil?

Solução

Como é para a educação, como você diz, eu vou te mostrar como eu faria uma coisinha. Caso contrário, stringstream é realmente o caminho a percorrer.

Parece que você quer para criar uma implementação streambuf que, em seguida, escreve a um vector / deque. Algo como isto (copiar de outra resposta de mim que alvo um / dev / fluxo nulo ):

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;

Você pode usá-lo como este:

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

Se você quiser ter um deque como seqüência, você pode fazê-lo:

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

Ou algo semelhante ... Bem, eu não testei ele. Mas talvez isso também é uma coisa boa - por isso, se ele ainda contém erros, você pode tentar corrigi-los.

Outras dicas

Use std :: stringstream

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

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

Eu vou apenas observar que você não tem que escrever um ostream-como classe para isso. Você pode usar um adaptador para atingir o seu objetivo.

Por exemplo, este código lê de istream e insere cada elemento em um vetor:

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

Sem mais detalhes sobre o que você quer fazer é difícil ser muito específico, mas você não quer criar um novo ostream. O que você quer fazer é criar um novo tipo streambuf, e usar um ostream existente.

A coisa easyist a fazer é para herdar de std :: basic_filebuf <>, e sobrecarregar o sync () e transbordo () métodos para adicionar elementos de suas estruturas de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top