User Tools

Site Tools


cpp:isteams

Input Streams

Όπως προαναφέρθηκε τα streams εισόδου χρησιμοποιούν τον τελεστη >> (stream extraction operator) για την ανάγνωση από το stream. H standard βιβλιοθήκη παρέχει συναρτήσεις υπεφόρτωσης για τους βασικούς τύπους δεδομένων, ενώ δίνεται η δυνατότητα υπερφόρτωσης για όλους τους μη βασικούς τύπους που θα χρειαστεί να κατασκευάσετε στα προγράμματα σας. Το παρακάτω παράδειγμα διαβάσματος από το πληκτρολόγιο (stdin) είναι ενδεικτικό.

istream_example.cpp
#include <iostream>
 
using namespace std;
 
int main() {
  char c, str[256];
  int number;
  double factor;
 
  cin >> c;
  cout << "Read: " << c << endl;
  cin >> str;
  cout << "Read: " << str << endl;
  cin >> number;
  cout << "Read: " << number << endl;
  cin >> factor;
  cout << "Read: " << factor << endl;
}

Για είσόδο hello -1512 1.63, η έξοδος είναι

Read: h
Read: ello
Read: -1512
Read: 1.63

Παρατηρήστε ότι από την πρώτη κλήση διαβάζεται ένας χαρακτήρας, ενώ από την 2η κλήση διαβάζεται το υπόλοιπο του stream μέχρι να συναντήσουμε κενό χαρακτήρα, χαρακτήρα tab ή χαρακτήρα αλλαγής γραμμής. Ο κενός χαρακτήρας, ο χαρακτήρας tab ή ο χαρακτήρας αλλαγής γραμμής αποτελούν διαχωριστές την πληροφορίας ανάγνωσης ενός stream εισόδου και αγνοούνται από το stream.

Διαβάζοντας λέξη-λέξη ή γραμμή-γραμμή

Εάν πρόκειται να διαβάσουμε ένα κείμενο, η standard βιβλιοθήκη μας δίνει τη δυνατότητα να διαβάσουμε το κείμενο λέξη-λέξη ως εξής:

input_word.cpp
#include <iostream>
#include <cstdlib> // for exit()
 
using namespace std;
 
int main() {
  char str[256];
  while(!cin.eof()) {
    cin >> str;
    cout << " -> " << str << endl;
  }
}

Το παραπάνω παράδειγμα για να δουλέψει με ασφάλεια θα πρέπει να είμαστε σίγουροι ότι η λέξη μέγιστου μήκους που θα διαβάσουμε θα έχει μέγεθος 255 χαρακτήρες (συν το χαρκτήρα '\0'). Εναλλακτικά μπορούμε να διαβάσουμε μία ολόκληρη γραμμή χρησιμοποιώντας τη συνάρτηση getline ως εξής:

input_line.cpp
#include <iostream>
#include <cstdlib> // for exit()
 
using namespace std;
 
int main() {
  char str[256];
  while(!cin.eof()) {
    // Read a line of maximum size 255 bytes.
    cin.getline(str, 256);
    cout << " -> " << str <<  endl;
  }
}

Σε αυτή την περίπτωση δεν είναι αναγκαίο να γνωρίζουμε ότι το μέγιστο μήκος γραμμής δεν υπερβαίνει τους 256 χαρακτήρες μαζί με τον χαρακτήρα αλλαγής γραμμής. Εάν μία γραμμή υπερβαίνει το συγκεκριμένο μέγεθος, θα διαβαστεί σε περισσότερες από μία επαναλήψεις.

Ο παραπάνω περιορισμός δεν ισχύει εάν χρησιμοποιήσουμε την έκδοση της συνάρτησης getline για την κλάση std::string. Σε αυτή την περίπτωση δεν απαιτείται καμία μέριμνα για το μέγεθος των εισαγόμενων συμβολοσειρών, διότι η κλάση std::string μπορεί να αποθηκεύσει συμβολοσειρές μεταβλητού μήκους και θεωρητικά άπειρου μεγέθους. Δείτε το ενδεικτικό παράδειγμα που ακολουθεί:

tokenize_using_std_string.cpp
#include <iostream>
#include <cstdlib> // for exit()
 
using namespace std;
 
int main() {
  string str;
  while(!cin.eof()) {
    getline(cin, str);
    cout << " -> " << str <<  endl;
  }
}
cpp/isteams.txt · Last modified: 2020/05/17 17:11 (external edit)