byte stream?



  • Hallo,

    ich bastel mir gerade eine Klasse, die auf einem (IO)Stream operieren soll. Der Stream ist aber eben nur ein Stream und nichts spezielles. Die Idee ist, dass beim Erstellen eines Objektes der Klasse eine Art Byte Stream angelegt werden soll, dem ich beliebig Bytes (also char's) anfügen kann, an beliebigen Positionen was ändern kann etc.
    Jetzt soll das Objekt aber auch mit fstreams arbeiten können, weswegen ich eben auf einen Stream, angewiesen bin, wenn ich eben gerade nicht auf einem fstream arbeite.

    Gibt es so einen "Byte Stream" schon irgendwo in der STL, oder muss ich mir da ggf. selbst etwas von iostream ableiten?

    Ich hab bereits versucht, mir einen iostream mit stringstream() als Parameter zu erzeugen, aber da knallt's sofort beim ersten Schreibzugriff, funktioniert also so wohl auch nicht direkt.

    Für Hilfe wäre ich dankbar.



  • Hallo manf,

    es ist mir nicht klar, was Du genau benötigst. Grundsätzlich kannst Du u.a. Bytes in einen ostream (bzw. ofstream) hineinschreiben und Bytes aus einem istream (bzw. ifstrem) herauslesen. Somit ist jeder Stream auch ein Byte-Stream.

    Du hast beim Stream auch die beiden beiden Methoden seekg (beim istream) und seekp (beim ostream) mit dem Du den Lese- bzw. Schreibzeiger versetzen kannst. Jedoch ist nicht garantiert, dass das immer möglich ist; beim i(o)fstream i.A. schon, aber z.B. nicht, wenn sich hinter dem Stream eine serielle Schnittstelle verbirgt.

    manf schrieb:

    .. oder muss ich mir da ggf. selbst etwas von iostream ableiten?

    ein häufig gemachter Fehler. Nein das ist keine gute Idee, um das Verhalten des Streams zu ändern.

    manf schrieb:

    Ich hab bereits versucht, mir einen iostream mit stringstream() als Parameter zu erzeugen, ..

    Da ist unklar , wie Du das meinst.

    Nenne doch einfach mal Deinen konkreten Anwendungsfall, dann kann man Dir sicher eher helfen.

    :xmas2: Werner



  • Ich schätze mal, er will eine Streamklasse haben, welche tellg und seekg auf einem Buffer und nicht in einer Datei ermöglichen. Eigentlich sollte das mit einem stringstream gehen.



  • Im Grunde soll meine Klasse so einen Datenstrom kapseln, indem es den Stream in Seiten einteilt. Beim ersten Erzeugen können neue Blöcke hinzugefügt werden, umsortiert werden etc. Der Stream soll dabei aber noch im Hauptspeicher liegen. Dann speicher ich den Stream irgendwann als Datei ab und dann möchte ich anschließend beim Laden der Datei mit dem Dateistream arbeiten (dann aber primär sowieso nur zum Lesen).

    Nur weiß ich eben nicht genau, wie ich einen neuen iostream erzeuge. Ich habe es mit std::iostream* str = new std::iostream(std:stringstream()); probiert, aber da bekomme ich eben sofort Probleme beim Schreibzugriff.



  • manf schrieb:

    Im Grunde soll meine Klasse so einen Datenstrom kapseln, indem es den Stream in Seiten einteilt. Beim ersten Erzeugen können neue Blöcke hinzugefügt werden, umsortiert werden etc. Der Stream soll dabei aber noch im Hauptspeicher liegen. Dann speicher ich den Stream irgendwann als Datei ab und dann möchte ich anschließend beim Laden der Datei mit dem Dateistream arbeiten (dann aber primär sowieso nur zum Lesen).

    Nur weiß ich eben nicht genau, wie ich einen neuen iostream erzeuge. Ich habe es mit std::iostream* str = new std::iostream(std:stringstream()); probiert, aber da bekomme ich eben sofort Probleme beim Schreibzugriff.

    Das klingt alles ziemlich suspekt. Vielleicht zeigst Du mal etwas Code.



  • Ich weiß zwar nicht was zum henker du da vor hast, aber bitte...

    iostream *str = new stringstream;
    
    *str << "test";
    
    delete str;
    

    Ob das koscha ist KA!



  • manf schrieb:

    Im Grunde soll meine Klasse so einen Datenstrom kapseln,

    ..das tut erst mal jeder iostream.

    manf schrieb:

    .. indem es den Stream in Seiten einteilt.

    Was verstehst Du unter einer Seite?

    manf schrieb:

    Beim ersten Erzeugen ..

    Erzeugen von was?

    manf schrieb:

    .. können neue Blöcke hinzugefügt werden, umsortiert werden etc.

    Ist ein Block eine Seite?

    manf schrieb:

    Der Stream soll dabei aber noch im Hauptspeicher liegen. Dann speicher ich den Stream irgendwann als Datei ab und dann möchte ich anschließend beim Laden der Datei mit dem Dateistream arbeiten (dann aber primär sowieso nur zum Lesen).

    Also Du brauchst irgendeine Seiten/Block-organisierte Datenstruktur, die auch in eine Datei geschrieben und von einer Datei gelesen werden kann - oder?

    manf schrieb:

    Nur weiß ich eben nicht genau, wie ich einen neuen iostream erzeuge.

    Na ja - erst mal den Stream erzeugen, den Du brauchst, also z.B.

    std::ostringstream meinStream; // fertig ist der Ausgabestream
    

    manf schrieb:

    Ich habe es mit std::iostream* str = new std::iostream(std:stringstream()); probiert, aber da bekomme ich eben sofort Probleme beim Schreibzugriff.

    Wo hast Du das denn her? Compiliert das überhaupt?

    Um konstruktiv weiter zu machen. Wie ist der Lesezugriff auf Deine Stream/Seiten/Block-Struktur? Was für Typen möchtest Du von dort wie lesen können?

    :xmas2: Werner



  • Wo hast Du das denn her? Compiliert das überhaupt?

    Allerdings...



  • er braucht erst mal keinen stream, um das zeug im speicher zu halten


Anmelden zum Antworten