| Both sides previous revision
Previous revision
Next revision
|
Previous revision
Next revision
Both sides next revision
|
cpp:osteams [2019/05/20 07:50] gthanos [std::ios::floatfield] |
cpp:osteams [2020/05/17 18:19] gthanos [Χρήση συναρτήσεων μορφοποίησης] |
| ====== Output Streams ====== | ====== Output Streams ====== |
| |
| Όπως προαναφέρθηκε τα //streams// εισόδου χρησιμοποιούν τον τελεστη ''>>'' (//stream insertion operator//) για την ανάγνωση από το //stream//. Σε αναλογία με τα //input streams//, η //standard// βιβλιοθήκη παρέχει συναρτήσεις υπεφόρτωσης για τους βασικούς τύπους δεδομένων, ενώ δίνεται η δυνατότητα [[cpp:vector_overloading_binary_operators|υπερφόρτωσης]] για όλους τους μη βασικούς τύπους που θα χρειαστεί να κατασκευάσετε στα προγράμματα σας. Το παρακάτω παράδειγμα γραψίματος στην κονσόλα (//stdout//) είναι ενδεικτικό. | Όπως προαναφέρθηκε τα //streams// εξόδου χρησιμοποιούν τον τελεστη ''<<'' (//stream insertion operator//) για εγγραφή στο //stream//. Σε αναλογία με τα //input streams//, η //standard// βιβλιοθήκη παρέχει συναρτήσεις υπεφόρτωσης για τους βασικούς τύπους δεδομένων, ενώ δίνεται η δυνατότητα [[cpp:vector_overloading_binary_operators|υπερφόρτωσης]] για όλους τους μη βασικούς τύπους που θα χρειαστεί να κατασκευάσετε στα προγράμματα σας. Το παρακάτω παράδειγμα γραψίματος στην κονσόλα (//stdout//) είναι ενδεικτικό. |
| |
| <code cpp stdout.cpp> | <code cpp stdout.cpp> |
| </code> | </code> |
| |
| ====== Μεταβάλλοντας τη μορφοποίηση σε ένα stream ====== | ====== Μεταβολή της μορφοποίησης σε ένα stream ====== |
| |
| Μπορείτε να αλλάξετε τη μορφοποίηση σε ένα stream με τους εξής δύο τρόπους: | Μπορείτε να αλλάξετε τη μορφοποίηση σε ένα stream με τους εξής δύο τρόπους: |
| * χρησιμοποιώντας τις συναρτήσεις μορφοποίησης **[[http://www.cplusplus.com/reference/ios/ios_base/setf/|setf]]** (θέτει ένα //flag// μορφοποίησης) και **[[http://www.cplusplus.com/reference/ios/ios_base/unsetf/|unsetf]]** (μηδενίζει ένα //flag// μορφοποίησης). | * χρησιμοποιώντας τις συναρτήσεις μορφοποίησης **[[http://www.cplusplus.com/reference/ios/ios_base/setf/|setf]]** (ενεργοποιεί ένα //flag// που συνδέεται με μία επιλογή μορφοποίησης) και **[[http://www.cplusplus.com/reference/ios/ios_base/unsetf/|unsetf]]** (απενεργοποιεί ένα //flag// που συνδέεται με μία επιλογή μορφοποίησης). |
| * χρησιμοποιώντας μορφοποιητών (//manipulators//) για το //stream//. | * χρησιμοποιώντας μορφοποιητές (//manipulators//) πάνω στο //stream//. |
| |
| ===== Χρήση συναρτήσεων μορφοποίησης ===== | ===== Χρήση συναρτήσεων μορφοποίησης ===== |
| </code> | </code> |
| |
| O παραπάνω κώδικας δεν δουλεύει σωστά, διότι είναι απαραίτητη και η γραμμή που είναι σε σχόλια προκειμένου να δουλέψει σωστά η μορφοποίηση. Στην πράξη, θα πρέπει εκτός από το να θέσουμε το //flag// ''std::ios::hex'' να καθαρίσουμε και το //flag// ''std::ios::dec''. Ο λόγος είναι ότι το //flag// ''std::ios::dec'' έχει μεγαλύτερη προτεραιότητα, και όσο είναι ενεργό οι αριθμοί εξακολουθούν να εκτυπώνονται σε δεκαδική μορφή. Εναλλακτικά, μπορείτε να χρησιμοποιήσετε την παρακάτω μορφή της συνάρτησης **setf**. | O παραπάνω κώδικας δεν δουλεύει σωστά, διότι είναι απαραίτητη και η γραμμή που είναι σε σχόλια. Στην πράξη, θα πρέπει εκτός από το να θέσουμε το //flag// ''std::ios::hex'' να καθαρίσουμε και το //flag// ''std::ios::dec''. Ο λόγος είναι ότι το //flag// ''std::ios::dec'' έχει μεγαλύτερη προτεραιότητα, και όσο είναι ενεργό οι αριθμοί εξακολουθούν να εκτυπώνονται σε δεκαδική μορφή. Εναλλακτικά, μπορείτε να χρησιμοποιήσετε την παρακάτω μορφή της συνάρτησης **setf**. |
| |
| <code cpp ostream-setf2.cpp> | <code cpp ostream-setf2.cpp> |
| int main() { | int main() { |
| cout.setf(std::ios::hex, std::ios::basefield); | cout.setf(std::ios::hex, std::ios::basefield); |
| cout << 16 << endl; | cout << "0x" <<16 << endl; |
| } | } |
| </code> | </code> |
| Η συγκεκριμένη μορφή της **set**, στην 1η παράμετρο λαμβάνει τα //flags// που θα ενεργοποιηθούν (εάν υπάρχουν περισσότερα του ενός, χρησιμοποιείτε τον δυαδικό τελεστή OR (|)) και στην 2η παράμετρο λαμβάνει το //group// των //flags// τα οποία θα μηδενιστούν, πριν ενεργοποιηθούν τα //flags// που ορίζονται στην 1η παράμετρο. | Η συγκεκριμένη μορφή της **set**, στην 1η παράμετρο λαμβάνει τα //flags// που θα ενεργοποιηθούν (εάν υπάρχουν περισσότερα του ενός, χρησιμοποιείτε τον δυαδικό τελεστή OR (|)) και στην 2η παράμετρο λαμβάνει το //group// των //flags// τα οποία θα μηδενιστούν, πριν ενεργοποιηθούν τα //flags// που ορίζονται στην 1η παράμετρο. |
| |
| ===== Χρήση μορφοποιητών (//manipulators//) ===== | ===== Χρήση μορφοποιητών (manipulators) ===== |
| |
| Η C++ δίνει τη δυνατότητα χρήσης μορφοποιητών, οι οποίοι επιτυγχάνουν το ίδιο ακριβώς αποτέλεσμα με τις συναρτήσεις **setf** και **unsetff**. Για παράδειγμα το προηγούμενο πρόγραμμα μπορεί να γραφεί με χρήση μορφοποιητών ως εξής: | Η C++ δίνει τη δυνατότητα χρήσης μορφοποιητών, οι οποίοι επιτυγχάνουν το ίδιο ακριβώς αποτέλεσμα με τις συναρτήσεις **setf** και **unsetf** και χρησιμοποιούνται ευρέως. Για παράδειγμα το προηγούμενο πρόγραμμα μπορεί να γραφεί με χρήση μορφοποιητών ως εξής: |
| |
| <code cpp ostream-manipulators.cpp> | <code cpp ostream-manipulators.cpp> |
| int main() { | int main() { |
| cout << std::hex << 16 << endl; | cout << std::hex << 16 << endl; |
| | cout << 16 << endl; |
| cout << std::oct << 16 << endl; | cout << std::oct << 16 << endl; |
| | cout << 16 << endl; |
| cout << std::dec << 16 << endl; | cout << std::dec << 16 << endl; |
| } | } |
| |
| ^ Group ^ Flag ^ Επεξήγηση ^ | ^ Group ^ Flag ^ Επεξήγηση ^ |
| | ''std::ios::floatfield''| std::ios::decimal | Χρήση δεκαδικής μορφής για την εκτύπωση αριθμών κινητής υποδιστολής. | | | ''std::ios::floatfield''| ''std::ios::decimal'' | Χρήση δεκαδικής μορφής για την εκτύπωση αριθμών κινητής υποδιστολής. | |
| | ''std::ios::floatfield''| std::ios::scientific | Χρήση δεκαδικής μορφής για την εκτύπωση αριθμών κινητής υποδιστολής. | | | ''std::ios::floatfield''| ''std::ios::scientific'' | Χρήση δεκαδικής μορφής για την εκτύπωση αριθμών κινητής υποδιστολής. | |
| | ''std::ios::floatfield''| none | Χρήση δεκαδικής μορφής για αριθμούς με λίγα ψηφία, διαφορετικά χρήση εκθετικής μορφής. Πρόκειται για την //default// υλοποίηση. | | | ''std::ios::floatfield''| ''none'' | Χρήση δεκαδικής μορφής για αριθμούς με λίγα ψηφία, διαφορετικά χρήση εκθετικής μορφής. Πρόκειται για την //default// υλοποίηση. | |
| | ''std::ios::floatfield''| std::ios::showpoint | | | | ''std::ios::floatfield''| ''std::ios::showpoint'' | | |
| |
| |