Ein- und Ausgabe in C++ - IO-Streams



  • @Side
    Die umfangreichste Behandlung findest du in dem Klassiker "Standard C++ IOStreams and Locales" von Langer und Kreft.

    Ein schöner Auszug:
    http://www.angelikalanger.com/IOStreams/Excerpt/excerpt.htm



  • Im Moment nicht verfügbar, aber ich setze es mal auf meine Todo-Liste.



  • @Hume: Danke, das Buch empfiehlst du mir sowieso immer wenn ich zu dem Thema frage 😉 Kann und will aber dezreit meine Buchsammlung derzeit nicht aufstocken und eventl. ist es doch etwas "zu viel" für die paar Basics 🙂

    @CStoll: Wenn da noch etwas drüber kommen würde 👍

    MfG SideWinder



  • Hallo,

    das mit den Puffern würde mich auch mal interessieren. Ich habe mal folgendes nachprogrammiert:

    http://www.edm2.com/0604/introcpp9.html

    Da wird ein beliebig großes Array in einem File behandelt. Z.B. wird der Operator [] auf entsprechende Streambefehle umgeleitet. Leider war das Ergebnis nicht sonderlich schnell. Aber wenn man den Puffer vergrößert und evtl. ein wenig anpaßt, könnte das sehr nützlich sein. Man könnte z.B. große WAV-Dateien auf Platte bearbeiten und sowas.

    Also ich fänd's Klasse, wenn's dahingehend mal ein Update gäbe... 😉

    Viele Grüße,
    Stimpy



  • Das mit der Geschwindigkeit ist kein Wunder - auch wenn du dich noch mehr verrenkst, ist Festplattenzugriff deutlich langsamer als RAM-Zugriff. Da müsstest du vermutlich mit einer eigenen Zwischenpufferung arbeiten, um größere Teile der Datei zwischenzulagern.
    (ich hab dein Beispiel jetzt nur überflogen, aber offenbar rennst du sehr viel per seek() durch deine Datei, um die Index-Zugriffe zu realisieren)

    Stream-Puffer gehen übrigens in eine andere Richtung: Du nimmst dir irgendeine externe Datenstruktur (z.B. ein Array im Speicher oder eine Datenbank) und liest/schreibst diese mit Hilfe der Stream-Methoden.



  • Und ich dachte, das ginge mit einem angepaßten Stream-Puffer eleganter.
    Eine eigene Pufferung hatte ich auch schon angedacht.

    Danke,
    Stimpy



  • Klar geht das schneller, aber auch aufwendiger - der Stream-Puffer könnte große Teile der Datei auf Vorrat lesen und dann durch die interne Kopie navigieren. Aber das erfordert einiges an Verwaltungsaufwand und es dürfte wohl einfacher sein, den Zwischenschritt über den Stream wegzulassen und die Daten direkt in großen Blöcken einzulesen und zu verwalten.

    (bzw der Stream-Puffer steht für dein Problem am falschen Ende der Datenstruktur)



  • nur ein kleiner Hinweis auf Boost.IOstream, damit kann man relativ leicht Filter oder eigene Quellen in einen Standard-Stream einfügen. Gibt auch schon einige fertige Filter, zB für gzip, bzip2, und fertige Quelle zB für UNIX-Filehandles.



  • mir fällt grad auf,
    Bei Exceptions:
    ios_base::exceptions() ist der Name der Funktion



  • Danke für den Hinweis - ich habe den Funktionsnamen oben korrigiert (btw, es ist basic_ios<>::exceptions() 😉 - zumindest laut MSDN).



  • Du hast "in_avial" statt "in_avail" geschrieben


Anmelden zum Antworten