Question

Je suis en train de créer un c ++ ostream pour des raisons pédagogiques. Mon test va créer un ostream qui agit comme un ofstream serait sauf qu'au lieu d'écrire à un fichier, il écrirait à un conteneur deque ou vecteur.

Était-ce utile?

La solution

Comme il est de l'éducation, comme vous le dites, je vais vous montrer comment je ferais un tel machin. Dans le cas contraire, stringstream est vraiment le chemin à parcourir.

On dirait que vous voulez créer une implémentation streambuf qui écrit alors un vecteur / deque. Quelque chose comme ceci (la copie d'une autre réponse de moi que ciblé un / dev / null flux ):

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;

Vous pouvez l'utiliser comme ceci:

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

Si vous voulez avoir une deque comme séquence, vous pouvez le faire:

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

Ou quelque chose de similaire ... Eh bien, je ne l'ai pas testé. Mais peut-être c'est aussi une bonne chose - si elle contient encore des bugs, vous pouvez essayer de les fixer.

Autres conseils

Utilisez std :: stringstream

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

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

Je vais juste faire remarquer que vous n'avez pas d'écrire un pour la classe comme ostream que. Vous pouvez utiliser un adaptateur pour atteindre votre objectif.

Par exemple, ce code de lit istream et insère chaque élément dans un vecteur:

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

Sans plus de détails sur ce que vous voulez faire, il est difficile d'être trop précis, mais vous ne voulez pas créer un nouveau ostream. Ce que vous voulez faire est de créer un nouveau type streambuf, et utiliser un ostream existant.

La chose easyist à faire est d'hériter de std :: basic_filebuf <>, et surcharger les méthodes de synchronisation () et trop-plein () pour ajouter des éléments à vos structures de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top