User Tools

Site Tools


cpp:osteams

This is an old revision of the document!


Output Streams

Όπως προαναφέρθηκε τα streams εισόδου χρησιμοποιούν τον τελεστη » (stream insertion operator) για την ανάγνωση από το stream. Σε αναλογία με τα input streams, η standard βιβλιοθήκη παρέχει συναρτήσεις υπεφόρτωσης για τους βασικούς τύπους δεδομένων, ενώ δίνεται η δυνατότητα υπερφόρτωσης για όλους τους μη βασικούς τύπους που θα χρειαστεί να κατασκευάσετε στα προγράμματα σας. Το παρακάτω παράδειγμα γραψίματος στην κονσόλα (stdout) είναι ενδεικτικό.

stdout.cpp
#include <iostream>
 
using namespace std;
 
int main() {
  string str("Welcome C++");
  const double PI = 3.14159;
  const int SIZE = 256;
 
  cout << str << " in CE325 course." << endl;
  cout << "Constant PI: " << PI << endl;
  cout << "SIZE is: " << SIZE << endl;
}

Μεταβάλλοντας τη μορφοποίηση σε ένα stream

Μπορείτε να αλλάξετε τη μορφοποίηση σε ένα stream με τους εξής δύο τρόπους:

  • χρησιμοποιώντας τις συναρτήσεις μορφοποίησης setf (θέτει ένα flag μορφοποίησης) και unsetf (μηδενίζει ένα flag μορφοποίησης).
  • χρησιμοποιώντας manipulators μορφοποίησης για το stream.

Χρήση συναρτήσεων μορφοποίησης

Ας υποθέσουμε ότι σε ένα stream θέλουμε η αριθμοί να εκτυπώνονται σε δεκαεξαδική μορφή. Προκειμένου να το πετύχουμε αυτό, θα πρέπει να κάνουμε τα εξής:

ostream-format.cpp
#include <iostream>
using namespace std;
 
int main() {
  cout.setf(std::ios::hex);
  //cout.unsetf(std::ios::dec);
  cout << 16 << endl;
}

O παραπάνω κώδικας δεν δουλεύει σωστά, διότι είναι απαραίτητη και η γραμμή που είναι σε σχόλια προκειμένου να δουλέψει σωστά η μορφοποίηση. Στην πράξη, θα πρέπει εκτός από το να θέσουμε το flag std::ios::hex να καθαρίσουμε και το flag std::ios::dec. Ο λόγος είναι ότι το flag std::ios::dec έχει μεγαλύτερη προτεραιότητα, και όσο είναι ενεργό οι αριθμοί εξακολουθούν να εκτυπώνονται σε δεκαδική μορφή. Εναλλακτικά, μπορείτε να χρησιμοποιήσετε την παρακάτω μορφή της συνάρτησης setf.

ostream-format.cpp
#include <iostream>
using namespace std;
 
int main() {
  cout.setf(std::ios::hex, std::ios::basefield);
  cout << 16 << endl;
}

Η συγκεκριμένη μορφή της set, στην 1η παράμετρο λαμβάνει τα flags που θα ενεργοποιηθούν (εάν υπάρχουν περισσότερα του ενός, χρησιμοποιείτε τον δυαδικό τελεστή OR (|)) και στην 2η παράμετρο λαμβάνει το group των flags στο οποίο αυτά ανήκουν. Τα flags που ανήκουν στο συγκεκριμένο group θα μηδενιστούν πριν τεθούν τα flags που ορίζονται στην 1η παράμετρο.

cpp/osteams.1558251197.txt.gz · Last modified: 2019/05/19 06:33 (external edit)