cpp:stream_states

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
cpp:stream_states [2019/05/21 07:19]
gthanos
cpp:stream_states [2020/05/18 06:11]
gthanos
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 28: Line 28:
   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>
  
  
cpp/stream_states.txt · Last modified: 2021/06/01 06:55 (external edit)