This is an old revision of the document!
Έλεγχος της εσωτερικής κατάστασης του stream
Κάθε stream διαθέτει μία σειρά από flags που ενημερώνουν για την κατάσταση του. Τα flags αυτά αποθηκεύονται στην μεταβλητή std::iosbase::iostate. Συγκεκριμένα η μεταβλητή περιέχει τα παρακάτω flags.
flag | Περιγραφή |
---|---|
goodbit | Κανένα λάθος. Το stream δουλεύει σωστά. |
badbit | Έχει συμβεί ένα κρίσιμο λάθος από τον οποίο δεν μπορεί να ανακάμψει το stream. |
eofbit | Έχουμε φτάσει κατά την ανάγνωση στο τέλος του stream |
failbit | Έχει συμβεί ένα μη κρίσιμο λάθος. Έχουμε αποτύχει να διαβάσουμε αυτό που υποδεικνύει ο κώδικας (π.χ. διάβασμα ενός αριθμού κινητής υποδιαστολής), αλλά μπορούμε να συνεχίσουμε την ανάγνωση. |
Οι ακόλουθες μέθοδοι ενημερώνουν για την εσωτερική κατάσταση του stream επιστρέφοντας μία boolean τιμή ως εξής:
bool good() const; | Επιστρέφει true εάν κανένα από τα error flags (failbit, badbit, eofbit) δεν έχει τιμή true. |
bool bad() const; | Ελέγχει εάν το badbit είναι true. Το badbit λαμβάνει τη τιμή true εάν συμβεί κάποιο μη αναστρέψιμο σφάλμα στο εσωτερικό του stream. Εάν το badbit γίνει true οποιαδήποτε ενέργεια πάνω στο stream θα πρέπει να αποκλειστεί. |
bool eof() const; | Ελέγχει εάν το eofdbit είναι true. To eofbit γίνεται true, όταν η διαδικασία ανάγνωσης φτάνει στο τέλος του αρχείου. |
bool fail() const; | Ελέγχει εάν το failbit ή το badbit έχουν τιμή true. Το failbit λαμβάνει τη τιμή true εάν συμβεί κάποιο λάθος στη χρήση του stream. Το λάθος δεν θεωρείται μη αναστρέψιμο και το stream είναι πιθανό ότι μπορεί να χρησιμοποιηθεί για επιπλέον λειτουργίες εισόδου ή εξόδου. |
Εναλλακτικά, μπορείτε να διαβάσετε το σύνολο των παραπάνω τιμών χρησιμοποιώντας τη συνάρτηση std::ios::rdstate(). Σε αυτή την περίπτωση όμως θα πρέπει να ξεχωρίσετε ποια flags είναι ενεργά και ποια όχι. Το ακόλουθο παράδειγμα είναι ενδεικτικό για το πως μπορείτε να χρησιμοποιήσετε τα flags για να ελέγξετε εάν ένα αρχείο έχει ανοίξει σωστά ή όχι, ελέγχοντας την κατάσταση του stream που το συνοδεύει.
- 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; }