| Both sides previous revision
Previous revision
Next revision
|
Previous revision
|
cpp:stream_states [2019/05/21 07:01] gthanos |
cpp:stream_states [2021/06/01 06:55] |
| ====== Έλεγχος της εσωτερικής κατάστασης του stream ====== | |
| |
| Κάθε //stream// διαθέτει μία σειρά από //flags// που ενημερώνουν για την κατάσταση του. Τα //flags// αυτά αποθηκεύονται στην μεταβλητή //[[http://www.cplusplus.com/reference/ios/ios_base/iostate/|std::iosbase::iostate]]//. Συγκεκριμένα η μεταβλητή περιέχει τα παρακάτω //flags//. | |
| |
| ^ flag ^ Περιγραφή ^ | |
| | **goodbit** | Κανένα λάθος. Το //stream// δουλεύει σωστά. | | |
| | **badbit** | Έχει συμβεί ένα κρίσιμο λάθος από τον οποίο δεν μπορεί να ανακάμψει το //stream//. | | |
| | **eofbit** | Έχουμε φτάσει κατά την ανάγνωση στο τέλος του //stream// | | |
| | **failbit** | Έχει συμβεί ένα μη κρίσιμο λάθος. Έχουμε αποτύχει να διαβάσουμε αυτό που υποδεικνύει ο κώδικας (π.χ. διάβασμα ενός αριθμού κινητής υποδιαστολής), αλλά μπορούμε να συνεχίσουμε την ανάγνωση. | | |
| |
| Οι ακόλουθες μέθοδοι ενημερώνουν για την εσωτερική κατάσταση του //stream// επιστρέφοντας μία //boolean// τιμή ως εξής: | |
| | <code cpp>bool good() const;</code> | Επιστρέφει //true// εάν κανένα από τα //error flags// (f**ailbit, badbit, eofbit**) δεν έχει τιμή //true//. | | |
| | <code cpp>bool bad() const;</code> | Ελέγχει εάν το **badbit** είναι //true//. Το **badbit** λαμβάνει τη τιμή //true// εάν συμβεί κάποιο μη αναστρέψιμο σφάλμα στο εσωτερικό του //stream//. Εάν το **badbit** γίνει //true// οποιαδήποτε ενέργεια πάνω στο //stream// θα πρέπει να αποκλειστεί. | | |
| | <code cpp>bool eof() const;</code> | Ελέγχει εάν το **eofdbit** είναι //true//. To **eofbit** γίνεται //true//, όταν η διαδικασία ανάγνωσης φτάνει στο τέλος του αρχείου. | | |
| | <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> | |
| // getting the state of stream objects | |
| #include <iostream> | |
| #include <fstream> | |
| |
| int main () { | |
| std::fstream fs; | |
| fs.open ("hello.txt"); | |
| if ( (fs.rdstate() & std::fstream::failbit ) != 0 ) | |
| std::cerr << "Error opening file 'hello.txt'\n"; | |
| return; | |
| } | |
| </code> | |