cpp:stream_states
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
cpp:stream_states [2019/05/20 11:44] – gthanos | cpp:stream_states [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
---|---|---|---|
Line 4: | Line 4: | ||
^ flag ^ Περιγραφή | ^ flag ^ Περιγραφή | ||
- | | **eofbit** | End-Of-File reached while performing an extracting operation on an input stream. | | + | | **goodbit** | Κανένα λάθος. Το //stream// δουλεύει σωστά. | |
- | | **failbit** | The last input operation failed because of an error related to the internal logic of the operation itself. | | + | | **badbit** | Έχει συμβεί ένα κρίσιμο λάθος από τον οποίο δεν μπορεί να ανακάμψει το //stream//. | |
- | | **badbit** | Error due to the failure of an input/output operation on the stream | + | | **eofbit** | Έχουμε φτάσει κατά την ανάγνωση στο τέλος του //stream// | |
- | | **goodbit** | No error. Represents the absence of all the above (the value zero). | | + | | **failbit** | Το flag τίθεται όταν συμβεί οποιοδήποτε λάθος από το οποίο μπορεί ή δεν μπορεί να ανακάμψει το stream. To flag τίθεται πάντα όταν έχει τεθεί και το flag **badbit**. Επιπλέον, |
Οι ακόλουθες μέθοδοι ενημερώνουν για την εσωτερική κατάσταση του //stream// επιστρέφοντας μία //boolean// τιμή ως εξής: | Οι ακόλουθες μέθοδοι ενημερώνουν για την εσωτερική κατάσταση του //stream// επιστρέφοντας μία //boolean// τιμή ως εξής: | ||
Line 15: | Line 15: | ||
| <code cpp>bool fail() const;</ | | <code cpp>bool fail() const;</ | ||
- | ===== Αλλαγή της θέσης ανάγνωσης ή εγγραφής στο stream | + | Εναλλακτικά, μπορείτε να διαβάσετε το σύνολο των παραπάνω τιμών χρησιμοποιώντας τη συνάρτηση [[http:// |
- | Τα //streams// εισόδου διατηρούν τη θέση ανάγνωσης και τα //streams// εξόδου τη θέση εγγραφής. //Streams// που υποστηρίζουν είσοδο και έξοδο διατηρούν ξεχωριστές θέσεις για ανάγνωση και για εγγραφή. | + | <code cpp check_file_open.cpp> |
- | + | ||
- | === Ανάγνωση της θέσης ανάγνωσης ή εγγραφής === | + | |
- | + | ||
- | Η κλάση //istream// διαθέτει τη συνάρτηση //tellg// για την ανάγνωση της θέσης ανάγνωσης μέσα στο //stream//. Η συνάρτηση επιστρέφει ένα αντικείμενο του τύπου // | + | |
- | <code cpp> | + | |
- | + | ||
- | Η κλάση //ostream// διαθέτει τη συνάρτηση //tellp// για την ανάγνωση της θέσης εγγραφής μέσα στο //stream//. Η συνάρτηση επιστρέφει ένα αντικείμενο του τύπου // | + | |
- | <code cpp> | + | |
- | + | ||
- | === Αλλαγή της θέσης ανάγνωσης ή εγγραφής === | + | |
- | + | ||
- | Η κλάση //istream// διαθέτει τη συνάρτηση //seekg// για την αλλαγή της θέσης ανάγνωσης μέσα στο //stream//. Η συνάρτηση επιστρέφει μία αναφορά στο υφιστάμενο //stream// και ορίζεται ως εξής: | + | |
- | <code cpp> | + | |
- | istream& | + | |
- | + | ||
- | Η κλάση //ostream// διαθέτει τη συνάρτηση //seekp// για την αλλαγή της θέσης εγγραφής μέσα στο //stream//. Η συνάρτηση επιστρέφει μία αναφορά στο υφιστάμενο //stream// και ορίζεται ως εξής: | + | |
- | <code cpp> | + | |
- | ostream& | + | |
- | + | ||
- | Οι παράμετροι που λαμβάνουν οι συναρτήσεις //seekg// και //seekp// είναι οι εξής: | + | |
- | * **pos:** Απόλυτη θέση μέσα στο //stream// ξεκινώντας από την αρχή. | + | |
- | * **off:** Σχετική θέση μέσα στο //stream//. Συνδέεται με την τιμή της μεταβλητής **way**. | + | |
- | * **way:** Μπορεί να πάρει μία από τις παρακάτω τιμές | + | |
- | + | ||
- | | **ios:: | + | |
- | | **ios:: | + | |
- | | **ios:: | + | |
- | + | ||
- | Ακολουθούν δύο παραδείγματα αλλαγής της θέσης ανάγωσης και εγγραφής πάνω στο //file stream//. | + | |
- | + | ||
- | <code cpp fileseek.cpp> | + | |
#include < | #include < | ||
#include < | #include < | ||
- | using namespace std; | ||
- | |||
- | int main (int argc, char *argv[]) { | ||
- | string filename; | ||
- | cout << "Enter output filename: "; | ||
- | cin >> filename; | ||
- | ofstream outfile(filename.c_str(), | ||
- | if (!outfile.is_open()) { | ||
- | cout << " | ||
- | return -1; | ||
- | } | ||
- | outfile << "I hate pointers | ||
- | outfile.flush(); | ||
- | | ||
- | ifstream infile(filename.c_str()); | ||
- | if (!infile.is_open()) { | ||
- | cout << " | ||
- | return -1; | ||
- | } | ||
- | string line; | ||
- | getline( infile, line ); | ||
- | cout << line << endl; | ||
- | | ||
- | outfile.seekp(2); | ||
- | outfile << " | ||
- | outfile.seekp(1, | ||
- | outfile << " | ||
- | outfile.seekp(0, | ||
- | outfile << " | ||
- | | ||
- | infile.seekg(0, | ||
- | getline( infile, line ); | ||
- | cout << line << endl; | ||
- | }</ | ||
- | <code cpp filesize.cpp> | ||
- | #include < | ||
- | #include < | ||
using namespace std; | using namespace std; | ||
int main () { | int main () { | ||
- | | + | |
- | string filename; | + | |
- | cout << "Enter filename: "; | + | if ( (fs.rdstate() & std::fstream:: |
- | | + | |
- | ifstream file(filename.c_str()); | + | |
- | if (!file.is_open()) { | + | |
- | cout << " | + | |
- | return -1; | + | |
- | } | + | |
- | begin = file.tellg(); | + | |
- | file.seekg (0, ios::end); | + | |
- | end = file.tellg(); | + | |
- | | + | |
- | cout << " | + | |
} | } | ||
</ | </ | ||
- | ===== Δυαδικά αρχεία ===== | + | ===== Έλεγχος των τιμών |
- | Για δυαδικά αρχεία η ανάγνωση και η εγγραφή με χρήση των τελεστών %%<< | + | Με έλεγχο των παραπάνω //flags// μπορούμε να κάνουμε έλεγχο της εισόδου που |
- | | | + | <code cpp input_validation.cpp> |
- | | <code cpp> | + | |
- | + | ||
- | Δείτε το παρακάτω παράδειγμα ανάγνωσης και εγγραφής από δυαδικό αρχείο. Το πρόγραμμα αντιγράφει το περιεχόμενο ενός υφιστάμενου αρχείου σε ένα άλλο σε τμήματα των SIZE bytes. | + | |
- | + | ||
- | <code cpp binary_copy.cpp> | + | |
#include < | #include < | ||
#include < | #include < | ||
- | #include < | + | |
using namespace std; | using namespace std; | ||
- | #define SIZE 512 | + | int main() { |
+ | double weight; | ||
- | int main (int argc, char *argv[]) { | + | while (true) { |
- | | + | cout << " |
- | | + | cin >> |
- | cin >> | + | |
- | | + | if (cin.fail()) { |
- | | + | // We failed to extract a double |
- | | + | cin.clear(); // reset stream state to goodbit. |
- | | + | cin.ignore(256, ' |
+ | continue; | ||
+ | | ||
+ | |||
+ | if (weight | ||
+ | continue; | ||
+ | |||
+ | | ||
} | } | ||
- | | + | |
- | cout << "Enter output filename: "; | + | cout << "You weight is: " << |
- | cin >> filename; | + | |
- | ofstream outfile(filename.c_str(), | + | |
- | if (!outfile.is_open()) { | + | |
- | cout << | + | |
- | return -1; | + | |
- | } | + | |
- | + | ||
- | char buf[SIZE]; | + | |
- | while(!infile.eof()) { | + | |
- | infile.read(buf, | + | |
- | outfile.write(buf, | + | |
- | } | + | |
- | infile.close(); | + | |
- | outfile.close(); | + | |
} | } | ||
</ | </ | ||
+ | |||
cpp/stream_states.1558352672.txt.gz · Last modified: 2019/05/20 10:44 (external edit)