User Tools

Site Tools


cpp:stream_states

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:stream_states [2019/05/21 06:28] gthanoscpp:stream_states [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 7: Line 7:
 |  **badbit**  | Έχει συμβεί ένα κρίσιμο λάθος από τον οποίο δεν μπορεί να ανακάμψει το //stream// | |  **badbit**  | Έχει συμβεί ένα κρίσιμο λάθος από τον οποίο δεν μπορεί να ανακάμψει το //stream// |
 |  **eofbit**  | Έχουμε φτάσει κατά την ανάγνωση στο τέλος του //stream// | |  **eofbit**  | Έχουμε φτάσει κατά την ανάγνωση στο τέλος του //stream// |
-|  **failbit** Έχει συμβεί ένα μη κρίσιμο λάθος. Έχουμε αποτύχει να διαβάσουμε αυτό που υποδεικνύει ο κώδικας (π.χ. διάβασμα ενός αριθμού κινητής υποδιαστολής)αλλά μπορούμε να συνεχίσουμε την ανάγνωση. |+|  **failbit** Το flag τίθεται όταν συμβεί οποιοδήποτε λάθος από το οποίο μπορεί ή δεν μπορεί να ανακάμψει το stream. To flag τίθεται πάντα όταν έχει τεθεί και το flag **badbit**. Επιπλέον, μπορεί να τεθεί εάν συμβεί ένα __μη κρίσιμο__ λάθος. Για παράδειγμα, έχουμε αποτύχει να διαβάσουμε αυτό που υποδεικνύει ο κώδικας, αλλά μπορούμε να συνεχίσουμε την ανάγνωση (π.χ. επιχειρούμε το διάβασμα ενός αριθμού κινητής υποδιαστολής, όμως ως είσοδος παρέχεται μία ακολουθία γραμμάτων). |
  
 Οι ακόλουθες μέθοδοι ενημερώνουν για την εσωτερική κατάσταση του //stream// επιστρέφοντας μία //boolean// τιμή ως εξής: Οι ακόλουθες μέθοδοι ενημερώνουν για την εσωτερική κατάσταση του //stream// επιστρέφοντας μία //boolean// τιμή ως εξής:
Line 14: Line 14:
 |  <code cpp>bool eof() const;</code>  | Ελέγχει εάν το **eofdbit** είναι //true//. To **eofbit** γίνεται //true//, όταν η διαδικασία ανάγνωσης φτάνει στο τέλος του αρχείου. | |  <code cpp>bool eof() const;</code>  | Ελέγχει εάν το **eofdbit** είναι //true//. To **eofbit** γίνεται //true//, όταν η διαδικασία ανάγνωσης φτάνει στο τέλος του αρχείου. |
 |  <code cpp>bool fail() const;</code>  | Ελέγχει εάν το **failbit** ή το **badbit** έχουν τιμή //true//. Το **failbit** λαμβάνει τη τιμή //true// εάν συμβεί κάποιο λάθος στη χρήση του //stream//. Το λάθος δεν θεωρείται μη αναστρέψιμο και το //stream// είναι πιθανό ότι μπορεί να χρησιμοποιηθεί για επιπλέον λειτουργίες εισόδου ή εξόδου. | |  <code cpp>bool fail() const;</code>  | Ελέγχει εάν το **failbit** ή το **badbit** έχουν τιμή //true//. Το **failbit** λαμβάνει τη τιμή //true// εάν συμβεί κάποιο λάθος στη χρήση του //stream//. Το λάθος δεν θεωρείται μη αναστρέψιμο και το //stream// είναι πιθανό ότι μπορεί να χρησιμοποιηθεί για επιπλέον λειτουργίες εισόδου ή εξόδου. |
 +
 +Εναλλακτικά, μπορείτε να διαβάσετε το σύνολο των παραπάνω τιμών χρησιμοποιώντας τη συνάρτηση [[http://www.cplusplus.com/reference/ios/ios/rdstate/|std::ios::rdstate()]]. Σε αυτή την περίπτωση όμως θα πρέπει να ξεχωρίσετε ποια //flags// είναι ενεργά και ποια όχι. Το ακόλουθο παράδειγμα είναι ενδεικτικό για το πως μπορείτε να χρησιμοποιήσετε τα //flags// για να ελέγξετε εάν ένα αρχείο έχει ανοίξει σωστά ή όχι, ελέγχοντας την κατάσταση του //stream// που το συνοδεύει.
 +
 +<code cpp check_file_open.cpp>
 +#include <iostream>
 +#include <fstream>
 +
 +using namespace std;
 +
 +int main () {
 +  std::ifstream fs;
 +  fs.open("non-exist.txt");
 +  if ( (fs.rdstate() & std::fstream::failbit ) != 0 )
 +    std::cerr << "Error opening file 'non-exist.txt'\n";
 +}
 +</code>
 +
 +===== Έλεγχος των τιμών εισόδου (input validation) =====
 +
 +Με έλεγχο των παραπάνω //flags// μπορούμε να κάνουμε έλεγχο της εισόδου που εισάγει ο χρήστης σε ένα πρόγραμμα, όταν καλούμαστε να διαβάσουμε έναν ακέραιο ή αριθμό κινητής υποδιαστολής. Δείτε το παρακάτω παράδειγμα, όπου ο χρήστης καλείται να εισάγει το βάρος του ως θετικό αριθμό κινητής υποδιαστολής. Εάν εισάγει κάτι διαφορετικό το πρόγραμμα ελέγχει το //failbit// και εφόσον αυτό είναι ενεργό, επαναλαμβάνει τη διαδικασία. Η συνάρτηση [[http://www.cplusplus.com/reference/istream/istream/ignore/|ignore]] αγνοεί τόσους χαρακτήρες όσους προσδιορίζει η 1η παράμετρος ή εάν βρεθεί ο χαρακτήρας που προσδιορίζεται στη 2η παράμετρο (όποιο από τα δύο συμβεί 1ο). 
 +
 +<code cpp input_validation.cpp>
 +#include <iostream>
 +#include <fstream>
 +
 +using namespace std;
 +
 +int main() {
 +  double weight;
 + 
 +  while (true) {
 +    cout << "Enter your weight: ";
 +    cin >> weight;
 + 
 +    if (cin.fail()) {
 +      // We failed to extract a double
 +      cin.clear();           // reset stream state to goodbit.
 +      cin.ignore(256, '\n'); // remove any input from the stream until \n
 +      continue;
 +    }
 + 
 +    if (weight <= 0)
 +      continue;
 + 
 +    break;
 +  }
 + 
 +  cout << "You weight is: " << weight << endl;
 +}
 +</code>
  
  
cpp/stream_states.1558420098.txt.gz · Last modified: 2019/05/21 05:28 (external edit)