Grundlegendes zum Stream-Konzept



  • Hallo, ich verstehe Streams wie sie in C++ oder Java vorkommen nicht.

    Wie kann ich mir die vorstellen?
    Was bewirkt flush()?

    so komisch es klingt, das macht mir kopfschmerzen

    was steckt dahinter?



  • Ein Stream ist ein Datenfluss, de von einem Eingang (Das kann ein File, ein Netzwerksocket, oder eine Benutzereingabe, oder ein grosser Datenbuffer (z. B. ein Byte-Array) oder sonstwas sein) zu einem Ausgang (Ebenfalls ein File, ein Socket, eine Variable, ...) fliesst.

    Ein "flush" sorgt in aller Regel dafuer, dass evtl. zwischengebufferte Daten Sofort an den Ausgang uebergeben werden. z. B. schreibt 'cout' in C++ nicht bei jedem Aufruf des operator<< sofort die Daten auf die Console, sondern wartet erstmal, ob nicht noch mehr kommt (das ist effizienter). Aber wenn du ein flush machst, dann werden alle Daten die noch nicht ausgegeben wurden, sofort ausgegeben, auch wenn das ineffizienter ist.

    EDIT: du kannst dir einen (Output)stream so vorstellen: du stopfst einfach alle Daten rein, die du ausgeben willst, und der Stream kuemmert sich dann darum, dass diese Daten (irgendwann) an ihrem Ziel (Die Konsole im Fall von cout, eine Ausgabedatei....) ankommen. Ausser du sagst "flush", dann werden die Daten sofort verschickt.



  • was streams sind, steht nun wirklich fast überall, wo irgendwas über C++ oder *n*x steht. Was verstehst du denn nicht ?

    'flush' heißt 'spülen' (Toilette) - das beschreibt es doch ganz gut.



  • u-ser_l schrieb:

    *n*x

    letztesmal haste noch ein 'l' davor gehabt.
    🙂



  • tats}chlich? da mu\ wohl der kezboard Treiber wieder abgeschmiert sein 😞



  • Die Frage ist berechtigt. Streams sind zwei Dinge:

    1. Die Streams sind eine Abstraktion von Eingabe- und Ausgabe-Geräten (Input/Output, deshal <iostream>). D.h. man kann Bytes (Daten) an diese Geräte schicken und lesen, ohne das konkrete Gerät zu kennen. Ich kann z.B. immer mit dem selben Konzept Bytes zu einem Drucker, Festplatte, Bildschirm, String usw. schicken. Es ist abstrakt und transparent für mich. Bsp.:

    void foo(std::ostream &os)
    {
         os << "Hallo!";
    }
    
    int main()
    {
        std::ofstream fo("test.txt");
        foo(fo); // wird Hallo! in Datei stehen
    
        foo(std::cout); // wird Hallo! auf Bildschirm stehen
    }
    

    Hier schiebe ich "Hallo!" in den Output-Stream. Es ist mir aber als foo unbekannt und vorallem auch egal ob ostream konkret ein Stringstream, Filestream, Printer-Stream usw. ist. Der Anwender von foo entscheidet was er mir da für einen ostream-Typen übergibt.

    2. Die Streams sind auch gepuffert. Das bringt Geschwindigkeitsvorteile, wenn z.B. Bytes erst im Puffer gesammelt werden und in einem Rutsch z.B. zum Drucker geschickt werden. Würden Streams keinen Puffer haben, würde z.B. ein Gerät jedes Byte einzeln erhalten und müsste auch jedes Byte einzeln behandeln... das kostet Zeit! Also wird gesammelt und das Gerät muß weniger oft behandeln.
    Wenn der Puffer voll ist, wird automatisch ein Flush gemacht - d.h. der Puffer an das Gerät "gespült". Ich kann aber auch ein Flush manuell machen, wenn ich das will.

    Man schlägt also mit den Streams zwei Fliegen mit einer Klappe.



  • Artchi schrieb:

    2. Die Streams sind auch gepuffert. Das bringt Geschwindigkeitsvorteile, wenn z.B. Bytes erst im Puffer gesammelt werden und in einem Rutsch z.B. zum Drucker geschickt werden. Würden Streams keinen Puffer haben, würde z.B. ein Gerät jedes Byte einzeln erhalten und müsste auch jedes Byte einzeln behandeln...

    der drucker kriegt sowieso jedes byte einzeln, bei 'ner seriellen schnittstelle gibts sogar jedes bit einzeln. der grund für pufferung ist einfach, weil irgendwo mengenorientierte APIs sitzen (WriteFile unter windoofs z.b.), oder ein DMA-mechanismus, der paketorientiert arbeitet.
    🙂



  • shisha schrieb:

    Hallo, ich verstehe Streams wie sie in C++ oder Java vorkommen nicht.

    u-ser_l schrieb:

    was streams sind, steht nun wirklich fast überall, wo irgendwas über C++ oder *n*x steht.

    Die Tatsache könnte der Grund sein.



  • Die Streams bzw. das Motto alles ist eine Datei (welche ein einfache Anreihung von Bytes ist) wurde übrigens von Unix erfunden (oder sollte man besser sagen von den Erfindern von Unix?). Wenn du also wirklich etwas über das Konzept wissen willst und nicht nur die IOStreams von C++, dann ist "The Art of Unix Programming" eine gute Anlaufstelle (ist sie übrigens für alle Programmierer, denn dort lernt man wirklich was über gutes Design und nicht nur über die Geschichte).


Log in to reply