| Both sides previous revision
Previous revision
Next revision
|
Previous revision
|
cpp:stream_states [2019/05/21 07:19] gthanos |
cpp:stream_states [2021/06/01 06:55] (current) |
| | **badbit** | Έχει συμβεί ένα κρίσιμο λάθος από τον οποίο δεν μπορεί να ανακάμψει το //stream//. | | | **badbit** | Έχει συμβεί ένα κρίσιμο λάθος από τον οποίο δεν μπορεί να ανακάμψει το //stream//. | |
| | **eofbit** | Έχουμε φτάσει κατά την ανάγνωση στο τέλος του //stream// | | | **eofbit** | Έχουμε φτάσει κατά την ανάγνωση στο τέλος του //stream// | |
| | **failbit** | Έχει συμβεί ένα μη κρίσιμο λάθος. Έχουμε αποτύχει να διαβάσουμε αυτό που υποδεικνύει ο κώδικας (π.χ. διάβασμα ενός αριθμού κινητής υποδιαστολής), αλλά μπορούμε να συνεχίσουμε την ανάγνωση. | | | **failbit** | Το flag τίθεται όταν συμβεί οποιοδήποτε λάθος από το οποίο μπορεί ή δεν μπορεί να ανακάμψει το stream. To flag τίθεται πάντα όταν έχει τεθεί και το flag **badbit**. Επιπλέον, μπορεί να τεθεί εάν συμβεί ένα __μη κρίσιμο__ λάθος. Για παράδειγμα, έχουμε αποτύχει να διαβάσουμε αυτό που υποδεικνύει ο κώδικας, αλλά μπορούμε να συνεχίσουμε την ανάγνωση (π.χ. επιχειρούμε το διάβασμα ενός αριθμού κινητής υποδιαστολής, όμως ως είσοδος παρέχεται μία ακολουθία γραμμάτων). | |
| |
| Οι ακόλουθες μέθοδοι ενημερώνουν για την εσωτερική κατάσταση του //stream// επιστρέφοντας μία //boolean// τιμή ως εξής: | Οι ακόλουθες μέθοδοι ενημερώνουν για την εσωτερική κατάσταση του //stream// επιστρέφοντας μία //boolean// τιμή ως εξής: |
| if ( (fs.rdstate() & std::fstream::failbit ) != 0 ) | if ( (fs.rdstate() & std::fstream::failbit ) != 0 ) |
| std::cerr << "Error opening file 'non-exist.txt'\n"; | 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> | </code> |
| |
| |