cpp:file_io
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
cpp:file_io [2018/05/21 02:53] – [Αρχεία κειμένου] gthanos | cpp:file_io [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Είσοδος και έξοδος αρχείων ====== | ====== Είσοδος και έξοδος αρχείων ====== | ||
- | Η C++ εισάγει την έννοια του | + | Η //standard// βιβλιοθήκη της C++ παρέχει τις παρακάτω κλάσεις για είσοδο και έξοδο από αρχεία. |
- | * να εισαχθούν στο //stream// με συγκεκριμένη σειρά και να γραφούν σε ένα αρχείο ή σε μία σειριακή συσκευή με τη σειρά που εισήχθησαν. | + | |
- | * να διαβαστούν από ένα αρχείο ή από μία σειριακή συσκευή με τη σειρά που είναι αποθηκευμένοι | + | |
- | + | ||
- | Βασικά χαρακτηριστικά των //streams// είναι τα εξής: | + | |
- | - Ένα //stream// μεταφράζεται πάντα σε μία ακολουθία χαρακτήρων. Τα //streams// δίνουν ένα ενιαίο τρόπο γραφής και ανάγνωσης προς τα αντικείμενα που τα χρησιμοποιούν για οποιοδήποτε μέσο επικοινωνίας/ | + | |
- | - Τα //streams// δουλεύουν αυτόματα με τους βασικούς τύπους δεδομένων. Για τους αναφορικούς τύπους μπορείτε να υπερφορτώσετε τους τελεστές %%>> | + | |
- | + | ||
- | Η C++ παρέχει τις παρακάτω κλάσεις για είσοδο και έξοδο από αρχεία. | + | |
- **[[http:// | - **[[http:// | ||
- **[[http:// | - **[[http:// | ||
- | - **http:// | + | - **[[http:// |
Οι παραπάνω κλάσεις είναι απόγονοι των κλάσεων // | Οι παραπάνω κλάσεις είναι απόγονοι των κλάσεων // | ||
Line 29: | Line 21: | ||
</ | </ | ||
- | ===== Άνοιγμα αρχείου για | + | ===== Άνοιγμα αρχείου για |
Το άνοιγμα των αρχείων γίνεται μέσω της μεθόδου //open// η οποία προδιαγράφεται παρακάτω: | Το άνοιγμα των αρχείων γίνεται μέσω της μεθόδου //open// η οποία προδιαγράφεται παρακάτω: | ||
Line 39: | Line 31: | ||
^ Τιμή | ^ Τιμή | ||
- | | **ios:: | + | | **ios:: |
- | | **ios:: | + | | **ios:: |
- | | **ios:: | + | | **ios:: |
- | | **ios::ate** | Θέτει τη θέση γραψίματος στο τέλος του αρχείου. Εάν | + | | **ios::app** | Η θέση |
- | | **ios::app** | Η θέση γραψίματος τίθεται | + | | **ios::ate** | Θέτει τη θέση |
| **ios:: | | **ios:: | ||
Line 82: | Line 74: | ||
===== Αρχεία κειμένου ===== | ===== Αρχεία κειμένου ===== | ||
- | //Streams// κειμένου είναι εκείνα τα streams που κατά το άνοιγμα του αρχείου δεν έχουν ορισμένο το //flag **ios:: | + | //Streams// κειμένου είναι εκείνα τα streams που κατά το άνοιγμα του αρχείου δεν έχουν ορισμένο το //flag **ios:: |
Ο τρόπος με τον οποίο γράφετε ή διαβάζετε είναι ο τρόπος που το κάνετε για τη βασική είσοδο και έξοδο. | Ο τρόπος με τον οποίο γράφετε ή διαβάζετε είναι ο τρόπος που το κάνετε για τη βασική είσοδο και έξοδο. | ||
Line 136: | Line 128: | ||
#include < | #include < | ||
using namespace std; | using namespace std; | ||
- | |||
- | #define MAX_LINE_LEN 128 | ||
int main () { | int main () { | ||
Line 144: | Line 134: | ||
cin >> filename; | cin >> filename; | ||
ifstream myfile (filename.c_str()); | ifstream myfile (filename.c_str()); | ||
- | char line[MAX_LINE_LEN]; | ||
| | ||
if (!myfile.is_open()) { | if (!myfile.is_open()) { | ||
Line 158: | Line 147: | ||
} | } | ||
</ | </ | ||
- | |||
- | ===== Έλεγχος της εσωτερικής κατάστασης του stream ===== | ||
- | |||
- | Κάθε //stream// διαθέτει μία σειρά από //flags// που ενημερώνουν για την κατάσταση του. Τα //flags// αυτά αποθηκεύονται στην μεταβλητή // | ||
- | |||
- | ^ flag ^ Περιγραφή | ||
- | | **eofbit** | ||
- | | **failbit** | ||
- | | **badbit** | ||
- | | **goodbit** | ||
- | |||
- | Οι ακόλουθες μέθοδοι ενημερώνουν για την εσωτερική κατάσταση του //stream// επιστρέφοντας μία //boolean// τιμή ως εξής: | ||
- | | <code cpp>bool good() const;</ | ||
- | | <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 < | ||
- | 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; | ||
- | |||
- | int main () { | ||
- | streampos begin,end; | ||
- | string filename; | ||
- | cout << "Enter filename: "; | ||
- | cin >> filename; | ||
- | 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(); | ||
- | cout << "file size is: " << (end-begin) << " bytes.\n"; | ||
- | } | ||
- | </ | ||
===== Δυαδικά αρχεία ===== | ===== Δυαδικά αρχεία ===== | ||
Line 273: | Line 152: | ||
Για δυαδικά αρχεία η ανάγνωση και η εγγραφή με χρήση των τελεστών %%<< | Για δυαδικά αρχεία η ανάγνωση και η εγγραφή με χρήση των τελεστών %%<< | ||
- | | <code cpp> | + | | <code cpp> |
| <code cpp> | | <code cpp> | ||
- | Δείτε το παρακάτω παράδειγμα ανάγνωσης και εγγραφής από δυαδικό αρχείο. Το πρόγραμμα αντιγράφει το περιεχόμενο ενός αρχείου σε ένα άλλο | + | Δείτε το παρακάτω παράδειγμα ανάγνωσης και εγγραφής από δυαδικό αρχείο. Το πρόγραμμα αντιγράφει το περιεχόμενο ενός |
<code cpp binary_copy.cpp> | <code cpp binary_copy.cpp> | ||
Line 284: | Line 163: | ||
using namespace std; | using namespace std; | ||
- | #define SIZE 1 | + | #define SIZE 512 |
int main (int argc, char *argv[]) { | int main (int argc, char *argv[]) { | ||
Line 307: | Line 186: | ||
while(!infile.eof()) { | while(!infile.eof()) { | ||
infile.read(buf, | infile.read(buf, | ||
- | outfile.write(buf, | + | outfile.write(buf, |
} | } | ||
infile.close(); | infile.close(); | ||
Line 313: | Line 192: | ||
} | } | ||
</ | </ | ||
+ | |||
cpp/file_io.1526871183.txt.gz · Last modified: 2018/05/21 01:53 (external edit)