ostream_iterator - wie erhalte ich einen iterator der auf eins nach dem Ende zeigt?



  • was ist wenn ich etwas schreiben will aber nicht weiß, ob und wann der buffer voll ist?


  • Mod

    Welcher Buffer? Das ist ein ostream, wenn der überhaupt einen Buffer hat, dann ist der für dich unsichtbar. Meinst du einen ostreambuf_iterator? Der hat einen Zustand failed, was in aller Regel bedeutet, dass der Buffer voll ist. Und auch dort macht es immer noch keinen Sinn, einen Iterator für das Ende zu definieren. Wie würdest du das nutzen wollen?



  • Nein ich meinte schon ostream. weißt du zufällig wo man nachlesen kann wie streams auf hardware implementiert sind? oder wie streams im allgemeinen funktionieren? die c++ dokumentation finde ich schwer zu lesen.


  • Mod

    Der Stream hat gar nichts mit Hardware zu tun, das ist ein ganz abstraktes Konzept. Das ist eine (mehr oder weniger) bequeme Schnittstelle für den Programmierer, damit man sich nicht dauernd mit den Feinheiten von Formatierung herumschlagen braucht. Ein ostream hat einen streambuf, der ist schon etwas konkreter, aber ist hauptsächlich immer noch eine Schnittstelle für den ostream, über den der dann Schreiben/Lesen kann. Der streambuf hat eine Reihe von virtuellen Funktionen, die man überschreiben würde, wenn man seinen eigenen ostream schreiben wollte. Für einen ostream würde man in der Regel die Funktionen xsputn und overflow des streambuf überschreiben. Diese könnten dann tatsächlich etwas tun, wo Zeichen dein Programm verlassen (oder auch nicht, du kannst schließlich coden was du willst). Das ist aber in aller Regel auch nichts mit Hardware, sondern wird bestenfalls ein Aufruf an das Betriebssystem sein, etwas mit den Zeichen zu tun. Wie das passiert ist dann aber nicht mehr deine Sache.

    PS: Also ungefähr so:

    • Stream-Ebene: Macht Formatierung und so, gibt das an Streambuf weiter
    • Streambuf-Ebene: Vermittelt zwischen Stream und dem wo man hinschreiben will
    • Das Ding wo man hinschreiben will: Kommt halt drauf an was das ist. Der Streambuf muss wissen, wie man das benutzt.

    Istreams genau umgekehrt.


  • Gesperrt

    @fairy2211

    Ich glaube, du willst hier zwei Sachen machen, einmal einen eigenen Iterator und zum anderen soll dieser Iterator << überschreiben.

    Das ergibt aber nur begrenzt Sinn (wie schon gesagt wurde), denn wenn du

    std::cout << << my_out_iter;
    

    aufrufst, woher wüsstest du dann, wann der Iterator fertig ist?

    Also ... was möchtest du machen oder nach-implementieren?


    @fairy2211 sagte in ostream_iterator - wie erhalte ich einen iterator der auf eins nach dem Ende zeigt?:

    Nein ich meinte schon ostream. weißt du zufällig wo man nachlesen kann wie streams auf hardware implementiert sind?

    Die Hardware hat damit nichts zu tun, weil alles auf dem Stack und Heap (im Arbeitsspeicher) stattfindet ... Darum kümmert sich das OS.



  • @sepe sagte in ostream_iterator - wie erhalte ich einen iterator der auf eins nach dem Ende zeigt?:

    Die Hardware hat damit nichts zu tun, weil alles auf dem Stack und Heap (im Arbeitsspeicher) stattfindet ... Darum kümmert sich das OS.

    ???

    Die Idee ist doch gerade, dass man unabhängig davon ist. Du kannst auch einen ostream haben, der einen Roboter steuert, der dann das, was man in den ostream schreibt, mit Kreide auf eine Tafel schreibt. Ein ostream kann also durchaus was mit Hardware machen.

    Oder einen ostream, der einfach alle Daten annimmt und gar nichts weiter tut (und ja, auch das kann mal sinnvoll sein). Dieser ostream bräuchte nicht einmal Arbeitsspeicher.

    Du hast schlicht irgendein Objekt, in das du was reinschreiben kannst. Danach kannst du testen, ob das Schreiben erfolgreich war.



  • @sepe danke für deine antwort! Ich will einfach mit

    ostream_iterator++;
    

    durch den buffer durchlaufen und mit

     *ostream_iterator
    

    die elemente einzeln in

    std::cout
    

    schreiben.



  • @fairy2211 Verwechselst du istream mit ostream?



  • ich dachte nein, der ostream buffer hält die folge, die für ein output gerät bestimmt ist. ich will es mit << nach std::cout schreiben. Falls << etwas mit dem buffer macht, dann geht das natürlich nicht aber das weiß ich nicht. für istream will ich das gleiche probieren.


  • Mod

    Was willst du da durchlaufen? Schreib einfach rein!


  • Gesperrt

    @wob sagte in ostream_iterator - wie erhalte ich einen iterator der auf eins nach dem Ende zeigt?:

    ???
    Die Idee ist doch gerade, dass man unabhängig davon ist. Du kannst auch einen ostream haben

    Es ging nicht um ostream und <<, es ging um die Datenstruktur hinter dem Iterator, und die kann nur irgendwo in einem Speicher liegen, und das regelt das OS ... oder kannst du mit C/C++ einen einzelnen RAM ansprechen? Ich glaub’ nicht. 😉

    ... Es ist für mich hier aber weiterhin noch völlig unklar, was der TO möchte.


  • Mod

    Du redest wieder dummes Zeug über Dinge, von denen du keine Ahnung hast.


  • Gesperrt

    @SeppJ Ja?! Was war denn falsch an meinen Beitrag. Nichts. Demnach scheinst du nicht die hellste Kerze auf der Torte zu sein...



  • @fairy2211 Iteratoren sind, wie Streams, Abstraktionen. Der ostream_iterator ist mit einem Ausgabe Stream verknüpft. Selbst der Operator ++ macht nichts. Das scheint erstmal unintuitiv da nicht aktiv iteriert wird, aber es macht Sinn, wenn man die Algorithmen betrachtet, in denen Objekte aus einer Iteration über den ostream_iterator raus geschrieben werden.

    Da du nicht weißt, wo der Outstream hinschreibt, kannst du weder darüber iterieren, noch wissen, welches seine letzte Position ist. Zum Beispiel könntest du dir Vorstellen mit einem Stream über eine Netzwerkverbindung irgendwo hin zu schreiben. Da kannst du über die Ausgabe nicht iterieren, weil du einfach keinen Zugriff hast.


Anmelden zum Antworten