Next revision | Previous revision |
cpp:streams [2019/05/14 12:07] – created gthanos | cpp:streams [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 |
---|
====== I/O Streams ====== | ====== I/O Streams ====== |
| |
Ένα //stream// είναι μία ακολουθία χαρακτήρων θεωρητικά άπειρου μεγέθους. Ένα //stream// μπορεί να χρησιμοποιηθεί για ανάγνωση από μία πηγή (π.χ. stdin, αρχείο, απομακρυσμένο αρχείο σε άλλο υπολογιστή ή το διαδίκτυο κλπ) ή για εγγραφή σε ένα προορισμό (π.χ. stdout, αρχείο στο σκληρό δίσκο, απομακρυσμένο αρχείο). | Η C++ εισάγει την έννοια του //stream//, ως μία ακολουθία χαρακτήρων θεωρητικά άπειρου μεγέθους. Οι χαρακτήρες: |
| * εισάγονται στο //stream// με συγκεκριμένη σειρά και γράφονται σε ένα αρχείο, σε ένα socket ή σε μία σειριακή συσκευή με τη σειρά που εισήχθησαν. |
| * διαβάζονται από ένα αρχείο, από ένα socket ή από μία σειριακή συσκευή με τη σειρά που είναι αποθηκευμένοι ή με τη σειρά που εισήχθησαν στη συσκευή. |
| |
Ένα //stream// εισόδου (//**input stream**//) χρησιμοποιείται για ανάγνωση από μία πηγή. Η ανάγνωση γίνεται με τη βοήθεια του **extraction operator (>>)**. Αντίστοιχα, ένα //stream// εξόδου (//**output stream**//) για εγγραφή προς ένα προορισμό. Η εγγραφή πραγματοποιείται με τη βοήθεια του **insertion operator (<<)**. Εκτός των παραπάνω υπάρχουν τα //streams// εισόδου και εξόδου τα οποία έχουν τη δυνατότητα παράλληλης ανάγνωσης και εγγραφής. Τα //streams// αυτής της κατηγορίας χρησιμοποιούν και τους δύο παραπάνω τελεστές. | Βασικά χαρακτηριστικά των //streams// είναι τα εξής: |
| - Ένα //stream// μεταφράζεται πάντα σε μία ακολουθία χαρακτήρων. Τα //streams// παρέχουν ένα ενιαίο τρόπο γραφής και ανάγνωσης προς τα αντικείμενα που τα χρησιμοποιούν ανεξάρτητα από το μέσο επικοινωνίας ή αποθήκευσης. Εάν μία κλάση μπορεί να γράψει σε ένα //stream// τότε μπορεί να γράψει σε όλους τους πιθανούς προορισμούς (αρχείο, socket, κονσόλα, κλπ) για τους οποίους μπορούμε να ανοίξουμε ένα //stream// ανάγνωσης ή εγγραφής. |
| - Από την //standard// βιβλιοθήκη παρέχονται συναρτήσεις υπερφόρτωσης, ώστε να μπορούμε να γράψουμε σε αυτά και να διαβάσουμε από αυτά τους βασικούς τύπους δεδομένων (int, double, std::string κλπ). Για τους τύπους που θα δημιουρήσετε εσείς στα προγράμματα σας, μπορείτε να υπερφορτώσετε τους τελεστές %%>>%% και %%<<%% για είσοδο και έξοδο προς οποιοδήποτε //stream//. Η χρήση των τελεστών %%>>%% και %%<<%% σε ένα πρόγραμμα, απλοποιεί εξαιρετικά τον κώδικα για να γράψουμε σε ένα //stream// ή να διαβάσουμε από αυτό. |
| |
===== Standard Streams ===== | Ένα //stream// μπορεί να είναι: |
| * **//stream// εισόδου:**, μπορεί να χρησιμοποιηθεί για ανάγνωση από μία πηγή (π.χ. //stdin//, αρχείο, απομακρυσμένο αρχείο σε άλλο υπολογιστή). Τα //streams// εισόδου χρησιμοποιούν τον τελεστη %%>>%% (//stream extraction operator//) για ανάγνωση. |
| * **//stream// εξόδου:**, μπορεί να χρησιμοποιηθεί για εγγραφή σε ένα προορισμό (π.χ. //stdout//, αρχείο στο σκληρό δίσκο, απομακρυσμένο αρχείο). τα //streams// εξόδου χρησιμοποιούν τον τελεστη %%<<%% (//stream insertion operator//) για εγγραφή. |
| * **//stream// εισόδου και εξόδου:** Μπορεί να χρησιμοποιηθεί ταυτόχρονα και για τις δύο παραπάνω λειτουργίες. |
| |
H C++ έρχεται με μία σειρά από //standard streams//, τα οποία είναι τα εξής: | Στην παρακάτω εικόνα δίνεται η βασική διάρθρωση των //streams// της C++, όπου φαίνονται και οι μεταξύ τους σχέσεις κληρονομικότητας. Κάτω από το όνομα κάθε κλάσης αναφέρεται το όνομα του αρχείου στο οποιό δηλώνεται το //prototype// της. |
| |
| {{ :cpp:cpp_io_library.png |}} |
| |
| ===== Αλληλεπίδραση με τη βασική είσοδο και έξοδο ===== |
| |
| H C++ έρχεται με μία σειρά από έτοιμα //streams// για αλληλεπίδραση με την κονσόλα. Τα //streams// αυτά είναι τα εξής: |
* **std::cin:** Stream για διάβασμα από το πληκτρολόγιο (//stdin//). | * **std::cin:** Stream για διάβασμα από το πληκτρολόγιο (//stdin//). |
* **std::cout:** Stream για γράψιμο στο //stdout//. | * **std::cout:** Stream για γράψιμο στο //stdout//. |
* **std::clog:** Stream για γράψιμο στο //stderr//. To συγκεκριμένο stream είναι buffered. | * **std::clog:** Stream για γράψιμο στο //stderr//. To συγκεκριμένο stream είναι buffered. |
| |
| ===== Παράδειγμα χρήσης διαβάσματος στο cin και γραψίματος στα cout και cerr ===== |
| |
| <code cpp ReadHeight.cpp> |
| #include <iostream> |
| using namespace std; |
| |
| int main() { |
| double height; |
| |
| do { |
| cout << "Enter your height (in meters): "; |
| cin >> height; |
| |
| if(height > 0) |
| break; |
| |
| cerr << "Invalid height. Try again..." << endl; |
| } while(true); |
| |
| cout << "You height is: " << height << " meters." << endl; |
| } |
| </code> |