This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision | |||
|
cpp:file_io [2020/05/17 18:17] |
cpp:file_io [2020/05/17 19:17] gthanos |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Είσοδος και έξοδος αρχείων ====== | ||
| + | |||
| + | Η // | ||
| + | - **[[http:// | ||
| + | - **[[http:// | ||
| + | - **[[http:// | ||
| + | |||
| + | Οι παραπάνω κλάσεις είναι απόγονοι των κλάσεων // | ||
| + | |||
| + | <code cpp hello_file.cpp> | ||
| + | #include < | ||
| + | #include < | ||
| + | using namespace std; | ||
| + | |||
| + | int main() { | ||
| + | ofstream myfile; | ||
| + | myfile.open (" | ||
| + | myfile << "Hello World!"; | ||
| + | myfile.close(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Άνοιγμα αρχείου για ανάγνωση και εγγραφή ===== | ||
| + | |||
| + | Το άνοιγμα των αρχείων γίνεται μέσω της μεθόδου //open// η οποία προδιαγράφεται παρακάτω: | ||
| + | <code cpp> | ||
| + | void open (const char* filename, ios_base:: | ||
| + | </ | ||
| + | |||
| + | Η παράμετρος // | ||
| + | |||
| + | ^ Τιμή | ||
| + | | **ios:: | ||
| + | | **ios:: | ||
| + | | **ios:: | ||
| + | | **ios:: | ||
| + | | **ios:: | ||
| + | | **ios:: | ||
| + | |||
| + | Οι παραπάνω τιμές μπορούν να συνδυαστούν ως εξής: | ||
| + | <code cpp> | ||
| + | ofstream lena; | ||
| + | // Open lena.png for writing in binary mode. | ||
| + | // Truncate file contents if file previously exists. | ||
| + | lena.open(" | ||
| + | </ | ||
| + | |||
| + | === Default τιμές === | ||
| + | |||
| + | Οι //default// τιμές της παραμέτρου //mode// για τις παραπάνω κλάσεις κλάσεις έχουν ως εξής: | ||
| + | |||
| + | ^ Κλάση | ||
| + | | **ofstream** | ||
| + | | **ifstream** | ||
| + | | **fstream** | ||
| + | |||
| + | Παρατηρήστε ότι η μέθοδος //open// δεν έχει επιστρεφόμενη τιμή για να ελέγξουμε την αποτυχία, | ||
| + | <code cpp> | ||
| + | ofstream lena(" | ||
| + | if (!lena.is_open()) { cerr << "Error while opening \" | ||
| + | </ | ||
| + | |||
| + | <WRAP center round tip 80%> | ||
| + | Παρατηρήστε ότι στο παραπάνω παράδειγμα χρησιμοποιούμε τον κατασκευαστή της κλάσης // | ||
| + | </ | ||
| + | |||
| + | ===== Κλείσιμο αρχείου ===== | ||
| + | |||
| + | Για να κλείσετε το αρχείο που προηγουμένως ανοίξατε με τη μέθοδο //open// αρκεί να καλέσετε τη μέθοδο //close// ως εξής: | ||
| + | <code cpp> | ||
| + | lena.close(); | ||
| + | </ | ||
| + | |||
| + | ===== Αρχεία κειμένου ===== | ||
| + | |||
| + | //Streams// κειμένου είναι εκείνα τα streams που κατά το άνοιγμα του αρχείου δεν έχουν ορισμένο το //flag **ios:: | ||
| + | |||
| + | Ο τρόπος με τον οποίο γράφετε ή διαβάζετε είναι ο τρόπος που το κάνετε για τη βασική είσοδο και έξοδο. | ||
| + | ^ Γράψιμο σε αρχείο κειμένου | ||
| + | |<code cpp file_write.cpp> | ||
| + | #include < | ||
| + | #include < | ||
| + | using namespace std; | ||
| + | |||
| + | int main (int argc, char *argv[]) { | ||
| + | string filename; | ||
| + | cout << "Enter output filename: "; | ||
| + | cin >> filename; | ||
| + | ofstream myfile (filename.c_str()); | ||
| + | if (!myfile.is_open()) { | ||
| + | cout << " | ||
| + | return -1; | ||
| + | } | ||
| + | myfile << "- Which OO language do you prefer? | ||
| + | myfile << "- My favorite is C++.\n"; | ||
| + | myfile << "- I prefer Java and Python.\n"; | ||
| + | myfile.close(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ^ Διάβασμα από αρχείο κειμένου γραμμή-γραμμή ^ Διάβασμα από αρχείο κειμένου λέξη-λέξη και εκτύπωση κάθε λέξης σε νέα γραμμή ^ | ||
| + | |<code cpp file_read_line_by_line.cpp> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | using namespace std; | ||
| + | |||
| + | #define MAX_LINE_LEN 1024 // really big! | ||
| + | |||
| + | int main () { | ||
| + | string filename; | ||
| + | cout << "Enter input filename: "; | ||
| + | cin >> filename; | ||
| + | ifstream myfile (filename.c_str()); | ||
| + | char line[MAX_LINE_LEN]; | ||
| + | | ||
| + | if (!myfile.is_open()) { | ||
| + | cout << " | ||
| + | return -1; | ||
| + | } | ||
| + | while ( myfile.getline (line, MAX_LINE_LEN) ) | ||
| + | cout << line << ' | ||
| + | myfile.close(); | ||
| + | } | ||
| + | </ | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | using namespace std; | ||
| + | |||
| + | int main () { | ||
| + | string filename, word; | ||
| + | cout << "Enter input filename: "; | ||
| + | cin >> filename; | ||
| + | ifstream myfile (filename.c_str()); | ||
| + | | ||
| + | if (!myfile.is_open()) { | ||
| + | cout << " | ||
| + | return -1; | ||
| + | } | ||
| + | while ( !myfile.eof() ) { | ||
| + | myfile >> word; | ||
| + | cout << word << endl; | ||
| + | } | ||
| + | myfile.close(); | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Δυαδικά αρχεία ===== | ||
| + | |||
| + | Για δυαδικά αρχεία η ανάγνωση και η εγγραφή με χρήση των τελεστών %%<< | ||
| + | |||
| + | | <code cpp> | ||
| + | | <code cpp> | ||
| + | |||
| + | Δείτε το παρακάτω παράδειγμα ανάγνωσης και εγγραφής από δυαδικό αρχείο. Το πρόγραμμα αντιγράφει το περιεχόμενο ενός υφιστάμενου αρχείου σε ένα άλλο σε τμήματα των SIZE bytes. | ||
| + | |||
| + | <code cpp binary_copy.cpp> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | using namespace std; | ||
| + | |||
| + | #define SIZE 512 | ||
| + | |||
| + | int main (int argc, char *argv[]) { | ||
| + | string filename; | ||
| + | cout << "Enter input filename: "; | ||
| + | cin >> filename; | ||
| + | ifstream infile(filename.c_str()); | ||
| + | if (!infile.is_open()) { | ||
| + | cout << " | ||
| + | return -1; | ||
| + | } | ||
| + | | ||
| + | cout << "Enter output filename: "; | ||
| + | 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(); | ||
| + | } | ||
| + | </ | ||
| + | |||