User Tools

Site Tools


cpp:osteams

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
cpp:osteams [2019/05/20 06:50] – [std::ios::basefield] gthanoscpp:osteams [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
 ====== 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>
Line 19: Line 19:
 </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//.
  
 ===== Χρήση συναρτήσεων μορφοποίησης ===== ===== Χρήση συναρτήσεων μορφοποίησης =====
Line 40: Line 40:
 </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>
Line 48: Line 48:
 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>
Line 54: Line 54:
 Η συγκεκριμένη μορφή της **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>
Line 64: Line 64:
 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;
 } }
Line 132: Line 134:
  
 ^ 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'' |  |
  
  
 ^ Μορφοποιητής ^ Επεξήγηση ^ ^ Μορφοποιητής ^ Επεξήγηση ^
-| std::fixed | Χρήση δεκαδικής μορφής | +''std::fixed'' | Χρήση δεκαδικής μορφής | 
-| std::scientific | Χρήση δεκαεξαδικής μορφής| +''std::scientific'' | Χρήση εκθετικής μορφής | 
-| std::showpoint | | +''std::showpoint'' Ακόμη και αν ο αριθμός δεν έχει δεκαδικό μέρος, εκτυπώνεται υποχρεωτικά η υποδιαστολή 
-| std::noshowpoint | | +''std::noshowpoint'' Εάν ο αριθμός δεν έχει δεκαδικό μέρος δεν εκτυπώνεται η υποδιαστολή 
-| std::setprecision(int) | |+''std::setprecision(int)'' (iomanip) | To //prototype// βρίσκεται στο αρχείο <iomanip>. Ορίζει την ακρίβεια εκτύπωσης των δεκαδικών ψηφίων του αριθμού. |
  
 <code cpp ostream-floatfield.cpp> <code cpp ostream-floatfield.cpp>
 #include <iostream> #include <iostream>
 +#include <iomanip>
 using namespace std; using namespace std;
  
 int main() { int main() {
      
 +  /* no special formatting specified */
 +  cout << 0.00000123456789012345678 << endl;
 +  cout << 0.0000123456789012345678 << endl;
 +  cout << 0.000123456789012345678 << endl;
 +  cout << 0.00123456789012345678 << endl;
 +  cout << 0.0123456789012345678 << endl;
 +  cout << 0.123456789012345678 << endl;
 +  cout << 123.4567890123456789 << endl;
 +  cout << 123456.7890123456789 << endl;
 +  cout << 123456789.0123456789 << endl;
 +  
 +  cout << std::showpoint << endl;
 +  cout << 30 << " " <<  1000L << " " << 1000.00 << " " << 3.14159;
 +  cout << std::noshowpoint << endl;
 +  cout << 30 << " " << 1000L << " " << 1000.00 << " " << 3.14159;
 +  cout << endl;
 +  
 +  cout << std::fixed << endl;
 +  cout << std::setprecision(1) << 123.456 << endl;
 +  cout << std::setprecision(2) << 123.456 << endl;
 +  cout << std::setprecision(3) << 123.456 << endl;
 +  cout << std::setprecision(4) << 123.456 << endl;
 +  cout << std::setprecision(5) << 123.456 << endl;
 +  cout << std::setprecision(6) << 123.456 << endl;
 +  cout << std::setprecision(7) << 123.456 << endl;
 +  
 +  cout << std::scientific << endl;
 +  cout << std::setprecision(1) << 123.456 << endl;
 +  cout << std::setprecision(2) << 123.456 << endl;
 +  cout << std::setprecision(3) << 123.456 << endl;
 +  cout << std::setprecision(4) << 123.456 << endl;
 +  cout << std::setprecision(5) << 123.456 << endl;
 +  cout << std::setprecision(6) << 123.456 << endl;
 +  cout << std::setprecision(7) << 123.456 << endl;
 } }
 </code> </code>
 +
 +<WRAP tip 80% center round>
 +Εάν δεν ορίσετε δικές σας παραμέτρους εκτύπωσης, οι αριθμοί κινητής υποδιαστολής εκτυπώνονται ως εξής:
 +    * Εάν ο αριθμός έχει ακέραιο μέρος μεγαλύτερο απο 7 ψηφία, τότε εκτυπώνεται σε εκθετική μορφή.
 +    * Εάν ο αριθμός έχει ακέραιο μέρος μηδέν και δεκαδικό μέρος με τέσσερα (4) ή περισσότερα μηδενικά στην αρχή εκτυπώνεται σε εκθετική μορφή.
 +    * Σε αντίθετη περίπτωση,
 +      * ο αριθμός των εκτυπωσιμων ψηφίων είναι 7, χωρίς να υπολογίζουμε το πρόσημο, την υποδιαστολή και το 0 εάν η απόλυτη τιμή του αριθμού είναι μικρότερη του 1.
 +      * Εάν το δεκαδικό μέρος του αριθμού είναι μεγαλύτερο από όσο μπορεί να εκτυπωθεί από την παραπάνω σύμβαση, τότε αυτό αποκόπτεται μετά από στρογγυλοποίηση.
 +</WRAP>
cpp/osteams.1558335033.txt.gz · Last modified: 2019/05/20 05:50 (external edit)