Frage

Ich versuche, einen c ++ Ostream aus pädagogischen Gründen zu erstellen. Mein Test wird eine Ostream erschaffen, die wie ein ofstream wirkt würden außer, statt in eine Datei zu schreiben, um es zu einem deque oder Vektor Container schreiben würde.

War es hilfreich?

Lösung

Wie es für die Bildung ist, wie Sie sagen, zeige ich Ihnen, wie ich so ein Ding tun würde. Ansonsten ist stringstream wirklich der Weg zu gehen.

Klingt wie Sie eine streambuf Implementierung erstellen möchten, die dann in einen Vektor / deque schreibt. So etwas wie dies (das Kopieren von einer anderen Antwort von mir, dass eine gezielte / dev / null Strom ):

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;

Sie können es wie folgt verwendet werden:

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

Wenn Sie eine deque als Folge haben wollen, können Sie dies tun:

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

oder etwas ähnliches ... Nun, ich habe es nicht getestet. Aber vielleicht ist das auch eine gute Sache - also, wenn es immer noch Fehler enthält, können Sie versuchen, sie zu fixieren.

Andere Tipps

Mit std :: string

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

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

Ich werde nur bemerken, dass Sie müssen keine Ostream artige Klasse für das schreiben. Sie können einen Adapter verwenden, um Ihr Ziel zu erreichen.

Zum Beispiel dieser Code liest aus istream und fügt jedes Element in einen Vektor:

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

Ohne näher auf das, was Sie tun möchten, ist es schwer zu spezifisch sein, aber Sie wollen nicht ein neues Ostream erstellen. Was Sie tun möchten, ist eine neue Art streambuf erstellen und eine vorhandene Ostream verwenden.

Das easyist, was zu tun ist von std :: erben basic_filebuf <> und Überlastung des sync () und Überlauf () -Methoden Elemente, um Ihre Datenstrukturen hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top