This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
cpp:file_io [2017/05/09 09:34] gthanos [Δυαδικά αρχεία] |
cpp:file_io [2020/05/17 18:17] (current) |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Η έννοια του stream ====== | ||
| - | |||
| - | Η C++ εισάγει την έννοια του //stream//, ως μία σειρά από χαρακτήρες οι οποίοι μπορούν: | ||
| - | * να γραφούν σε ένα αρχείο ή σε μία σειριακή συσκευή με τη σειρά που αυτοί εγγράφονται στο //stream//. | ||
| - | * να διαβαστούν από ένα αρχείο ή από μία σειριακή συσκευή με τη σειρά που είναι αποθηκευμένοι ή με τη σειρά που εισήχθησαν στη συσκευή. | ||
| - | |||
| - | Βασικά χαρακτηριστικά των //streams// είναι τα εξής: | ||
| - | - Ένα //stream// μεταφράζεται πάντα σε μία ακολουθία χαρακτήρων. Τα //streams// δίνουν ένα ενιαίο // | ||
| - | - Τα //streams// δουλεύουν αυτόματα με τους βασικούς τύπους δεδομένων. Για τους αναφορικούς τύπους μπορείτε να υπερφορτώσετε τους τελεστές %%>> | ||
| - | |||
| ====== Είσοδος και έξοδος αρχείων ====== | ====== Είσοδος και έξοδος αρχείων ====== | ||
| - | Η C++ παρέχει τις παρακάτω κλάσεις για είσοδο και έξοδο από αρχεία. | + | Η // |
| - | - **ifstream: | + | - **[[http:// |
| - | - **ofstream: | + | - **[[http:// |
| - | - **fstream: | + | - **[[http:// |
| - | Οι παραπάνω κλάσεις είναι απόγονοι των κλάσεων // | + | Οι παραπάνω κλάσεις είναι απόγονοι των κλάσεων // |
| <code cpp hello_file.cpp> | <code cpp hello_file.cpp> | ||
| Line 31: | Line 21: | ||
| </ | </ | ||
| - | ===== Άνοιγμα αρχείου ===== | + | ===== Άνοιγμα αρχείου |
| Το άνοιγμα των αρχείων γίνεται μέσω της μεθόδου //open// η οποία προδιαγράφεται παρακάτω: | Το άνοιγμα των αρχείων γίνεται μέσω της μεθόδου //open// η οποία προδιαγράφεται παρακάτω: | ||
| Line 41: | Line 31: | ||
| ^ Τιμή | ^ Τιμή | ||
| - | | **ios:: | + | | **ios:: |
| - | | **ios:: | + | | **ios:: |
| - | | **ios:: | + | | **ios:: |
| - | | **ios::ate** | Θέτει τη θέση γραψίματος στο τέλος του αρχείου. Εάν | + | | **ios::app** | Η θέση |
| - | | **ios::app** | Η θέση γραψίματος τίθεται | + | | **ios::ate** | Θέτει τη θέση |
| | **ios:: | | **ios:: | ||
| Line 65: | Line 55: | ||
| | **fstream** | | **fstream** | ||
| - | Για να ελέγξετε εάν ένα αρχείο έχει ανοίξει σωστά για διάβασμα μπορείτε να χρησιμοποιήσετε τη μέθοδο // | + | Παρατηρήστε ότι η μέθοδος //open// δεν έχει επιστρεφόμενη τιμή για να ελέγξουμε την αποτυχία, |
| <code cpp> | <code cpp> | ||
| ofstream lena(" | ofstream lena(" | ||
| Line 72: | Line 62: | ||
| <WRAP center round tip 80%> | <WRAP center round tip 80%> | ||
| - | Παρατηρήστε ότι στο παραπάνω παράδειγμα χρησιμοιούμε τον κατασκευαστή της κλάσης // | + | Παρατηρήστε ότι στο παραπάνω παράδειγμα χρησιμοποιούμε τον κατασκευαστή της κλάσης // |
| </ | </ | ||
| Line 84: | Line 74: | ||
| ===== Αρχεία κειμένου ===== | ===== Αρχεία κειμένου ===== | ||
| - | //Streams// κειμένου είναι εκείνα τα streams που κατά το άνοιγμα του αρχείου δεν έχουν ορισμένο το //flag **ios:: | + | //Streams// κειμένου είναι εκείνα τα streams που κατά το άνοιγμα του αρχείου δεν έχουν ορισμένο το //flag **ios:: |
| Ο τρόπος με τον οποίο γράφετε ή διαβάζετε είναι ο τρόπος που το κάνετε για τη βασική είσοδο και έξοδο. | Ο τρόπος με τον οποίο γράφετε ή διαβάζετε είναι ο τρόπος που το κάνετε για τη βασική είσοδο και έξοδο. | ||
| - | ^ Γράψιμο σε αρχείο κειμένου | + | ^ Γράψιμο σε αρχείο κειμένου |
| |<code cpp file_write.cpp> | |<code cpp file_write.cpp> | ||
| #include < | #include < | ||
| Line 107: | Line 97: | ||
| myfile.close(); | myfile.close(); | ||
| } | } | ||
| - | </ | + | </ |
| + | |||
| + | ^ Διάβασμα από αρχείο κειμένου γραμμή-γραμμή ^ Διάβασμα από αρχείο κειμένου λέξη-λέξη και εκτύπωση κάθε λέξης σε νέα γραμμή ^ | ||
| + | |<code cpp file_read_line_by_line.cpp> | ||
| #include < | #include < | ||
| #include < | #include < | ||
| Line 113: | Line 106: | ||
| using namespace std; | using namespace std; | ||
| - | #define MAX_LINE_LEN | + | #define MAX_LINE_LEN |
| int main () { | int main () { | ||
| Line 130: | Line 123: | ||
| myfile.close(); | myfile.close(); | ||
| } | } | ||
| - | </ | + | </ |
| - | + | ||
| - | ===== Έλεγχος της εσωτερικής κατάστασης του stream ===== | + | |
| - | + | ||
| - | Κάθε //stream// διαθέτει μία σειρά από //flags// που ενημερώνουν για την κατάσταση του. Τα //flags// αυτά αποθηκεύονται στην μεταβλητή // | + | |
| - | + | ||
| - | ^ flag ^ Περιγραφή | + | |
| - | | **eofbit** | + | |
| - | | **failbit** | + | |
| - | | **badbit** | + | |
| - | | **goodbit** | + | |
| - | + | ||
| - | Οι ακόλουθες μέθοδοι ενημερώνουν για την εσωτερική κατάσταση του //stream// επιστρέφοντας μία //boolean// τιμή ως εξής: | + | |
| - | | | + | |
| - | | <code cpp>bool bad() const;</ | + | |
| - | | <code cpp>bool eof() const;</ | + | |
| - | | <code cpp>bool fail() const;</ | + | |
| - | + | ||
| - | ===== Αλλαγή της θέσης ανάγνωσης ή εγγραφής στο stream ===== | + | |
| - | + | ||
| - | Τα //streams// εισόδου διατηρούν τη θέση ανάγνωσης και τα //strams// εξόδου τη θέση εγγραφής. //Streams// που υποστηρίζουν είσοδο και έξοδο διατηρούν ξεχωριστές θέσεις για ανάγνωση και για εγγραφή. | + | |
| - | + | ||
| - | === Ανάγνωση της θέσης ανάγνωσης ή εγγραφής === | + | |
| - | + | ||
| - | Η κλάση //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 < | ||
| + | #include < | ||
| using namespace std; | using namespace std; | ||
| - | + | ||
| - | int main (int argc, char *argv[]) { | + | int main () { |
| - | string filename; | + | string filename, word; |
| - | cout << " | + | cout << " |
| cin >> filename; | cin >> filename; | ||
| - | | + | |
| - | if (!outfile.is_open()) { | + | |
| - | cout << " | + | |
| - | return -1; | + | |
| - | } | + | |
| - | outfile << "I hate pointers | + | |
| - | outfile.flush(); | + | |
| | | ||
| - | | + | if (!myfile.is_open()) { |
| - | | + | cout << " |
| - | cout << "[Read] | + | |
| return -1; | return -1; | ||
| } | } | ||
| - | | + | |
| - | getline( infile, line ); | + | |
| - | cout << line << endl; | + | cout << |
| - | + | ||
| - | 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; | + | |
| - | + | ||
| - | int main () { | + | |
| - | | + | |
| - | string filename; | + | |
| - | cout << "Enter filename: "; | + | |
| - | cin >> | + | |
| - | ifstream file(filename.c_str()); | + | |
| - | if (!file.is_open()) { | + | |
| - | cout << | + | |
| - | return -1; | + | |
| } | } | ||
| - | begin = file.tellg(); | ||
| - | file.seekg (0, ios::end); | ||
| - | end = file.tellg(); | ||
| myfile.close(); | myfile.close(); | ||
| - | cout << "file size is: " << (end-begin) << " bytes.\n"; | + | |
| } | } | ||
| - | </ | + | </ |
| ===== Δυαδικά αρχεία ===== | ===== Δυαδικά αρχεία ===== | ||
| Line 246: | Line 152: | ||
| Για δυαδικά αρχεία η ανάγνωση και η εγγραφή με χρήση των τελεστών %%<< | Για δυαδικά αρχεία η ανάγνωση και η εγγραφή με χρήση των τελεστών %%<< | ||
| - | | <code cpp> | + | | <code cpp> |
| | <code cpp> | | <code cpp> | ||
| - | Παράδειγμα ανάγνωσης και εγγραφής από δυαδικό αρχείο. | + | Δείτε το παρακάτω παράδειγμα ανάγνωσης και εγγραφής από δυαδικό αρχείο. Το πρόγραμμα αντιγράφει το περιεχόμενο ενός υφιστάμενου αρχείου σε ένα άλλο σε τμήματα των SIZE bytes. |
| - | <code cpp transform_ppm.cpp> | + | <code cpp binary_copy.cpp> |
| #include < | #include < | ||
| #include < | #include < | ||
| + | #include < | ||
| using namespace std; | using namespace std; | ||
| + | |||
| + | #define SIZE 512 | ||
| int main (int argc, char *argv[]) { | int main (int argc, char *argv[]) { | ||
| Line 274: | Line 183: | ||
| } | } | ||
| | | ||
| - | char buf[15]; | + | char buf[SIZE]; |
| - | infile.read(buf, | + | |
| - | outfile.write(buf, | + | |
| - | + | ||
| while(!infile.eof()) { | while(!infile.eof()) { | ||
| - | infile.read(buf, | + | infile.read(buf, |
| - | double grayscale = 0.21 * buf[0] + 0.72 *buf[1] + 0.07 * buf[2]; | + | outfile.write(buf, |
| - | + | ||
| - | buf[0] = (char) grayscale; | + | |
| - | buf[1] = (char) grayscale; | + | |
| - | buf[2] = (char) grayscale; | + | |
| - | outfile.write(buf, | + | |
| } | } | ||
| infile.close(); | infile.close(); | ||
| Line 291: | Line 192: | ||
| } | } | ||
| </ | </ | ||
| + | |||