| Both sides previous revision
Previous revision
Next revision
|
Previous revision
Next revision
Both sides next revision
|
cpp:stream_states [2019/05/21 06:28] gthanos |
cpp:stream_states [2019/05/21 07:35] gthanos [Input validation] |
| | <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> |
| |
| |