Fstream

Το **fstream** είναι μια πρότυπη βιβλιοθήκη της C++ η οποία χειρίζεται το διάβασμα και γράψιμο από αρχεία κειμένου ή δυαδικά αρχεία. Η βιβλιοθήκη κληρονομεί χαρακτηριστικά από την iostream, η οποία είναι η γενικότερη βιβλιοθήκη για είσοδο/έξοδο. Η βιβλιοθήκη αυτή αποτελεί την αντικειμενοστραφή εκδοχή της βιβλιοθήκης cstdio/FILE της γλώσσας προγραμματισμού C.

Υπάρχουν τρεις τύποι κλάσεων που χρησιμοποιούνται για είσοδο και έξοδο σε εξωτερικά αρχεία :

* Η `ifstream` η οποία κληρονομεί χαρακτηριστικά από την `istream`, και χρησιμοποιείται για ανάγνωση δεδομένων από ένα εξωτερικό αρχείο.
* Η `ofstream` η οποία κληρονομεί χαρακτηριστικά από την `ostream`, και χρησιμοποιείται για εγγραφή δεδομένων σε ένα εξωτερικό αρχείο.
* Η `fstream` η οποία κληρονομεί χαρακτηριστικά από την `[[iostream]]`, και χρησιμοποιείται για ανάγνωση και εγγραφή δεδομένων από/σε ένα εξωτερικό αρχείο.

## Παραδείγματα

Για να χρησιμοποιηθεί η βιβλιοθήκη `fstream` θα πρέπει να χρησιμοποιηθεί το αρχείο επικεφαλίδας: `#include <fstream>` μέσα στο κώδικα όπως φαίνεται στο παρακάτω παράδειγμα :


```cpp
#include <fstream>
#include <string>     // για την κλάση αλφαριθμητικών string

int main() {

   ifstream infile ("inputfile.txt");

   // έλεγχος αν έχει ανοίξει το αρχείο για διάβασμα
   if (!infile) {
      cerr << "λάθος στο άνοιγμα του αρχείου inputfile.txt για διάβασμα" << endl;
      return 0;
   }

   string str;

   getline(infile, str, '\n');     // διαβάζει την πρώτη γραμμή του αρχείου στο αλφαριθμητικό str

   infile.close();                 // κλείσιμο του αρχείου (καλεί το destructor του infile).

   ofstream outfile("outputfile.txt");

   // έλεγχος αν έχει ανοίξει το αρχείο outputfile.txt δια γράψιμο
   if (!infile) {
      cerr << "λάθος στο άνοιγμα του αρχείου outputfile.txt για γράψιμο" << endl;
      return 0;
   }

   // χρησιμοποίηση του τελεστή << για να γραφτεί το περιεχόμενο του αλφαριθμητικού str 
   // στο εξωτερικό αρχείο outputfile.txt
   outfile << str;

   outfile.close()                 // κλείσιμο του αρχείου (καλεί το destructor του outfile).

   return 1;
}
```


### ofstream

Η βιβλιοθήκη **ofstream** μπορεί να χειριστεί ροή εξόδου δεδομένων σε εξωτερικά αρχεία. Το παρακάτω παράδειγμα παρουσιάζει την δημιουργία του εξωτερικού αρχείου κειμένου 'file.txt' και την εγγραφή του αλφαριθμητικού 'Γεια σου κόσμε!' το οποίο ακολουθείται με τον χαρακτήρα αλλαγής γραμμής (newline) *\n* ή *endl*.


```cpp
#include <fstream>

int main() {
    std::ofstream file;          // μπορεί να ενωθούν οι δυο γραμμές εντολών σε μία std::ofstream file("file.txt");
    file.open("file.txt");
    file << "Γεια σου κόσμε!\n";
    file.close();                // δεν είναι απαραίτητο αυτό γιατί στο τερματισμό του προγράμματος καλείται αυτόματα
                                 // ο τερματιστής (destructor) της κλάσης file.
    return 0;
}
```


### ifstream

Η βιβλιοθήκη **ifstream** μπορεί να χειριστεί ροή εισόδου από εξωτερικά αρχεία. Η διεπαφή του *ifstream* λειτουργεί με παρόμοιο τρόπο όπως με το *ofstream*.

Το παρακάτω παράδειγμα είναι η βασική λειτουργία της λειτουργίας cat στο unix, η οποία χειρίζεται την ροή εισόδου μέσω του ifstream:


```cpp
#include <iostream>  // για το cin, cout, endl, cerr
#include <fstream>   // για το ifstream
#include <string>    // για την κλάση-αντικείμενο αλφαριθμητικών string

using std::cin;      // είσοδος (see in)
using std::cout;     // έξοδος  (see out)
using std::endl;     // χαρακτήρας αλλαγής γραμμής \n
using std::cerr;     // έξοδος λαθών (see error)

void print(std::istream& in) {

    try {
        std::string tmp;
        
        while (1) {
            std::getline(in, tmp);
            tmp += '\n';
            cout.write(tmp.c_str(), tmp.length());
        }

    } catch (std::ifstream::failure e) {
        if (!in.eof())
            cerr << e.what() << endl;
    }
}

int main(int argc, char* argv[]) {
    std::ifstream in;
    in.exceptions( std::ifstream::eofbit | std::ifstream::failbit | std::ifstream::badbit);
    cin.exceptions(std::ifstream::eofbit | std::ifstream::failbit | std::ifstream::badbit);

    if (argc == 1) {
        print(cin);
    }

    try {

        for (int i = 1; i < argc; ++i) {
            if (argv[i] == std::string("-")) {
                print (cin);
            } else {
                in.open(argv[i]);
                print (in);
            }
        }

    } catch (std::ifstream::failure e) {
        cerr << e.what() << endl;
    }
}
```


## Παραπομπές


Κατηγορία:C++ (STL)