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

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

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

ΠαραδείγματαΕπεξεργασία

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

#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.

#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:

#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;
    }
}

ΠαραπομπέςΕπεξεργασία

  1. Bjarne Stroustrup (1997). The C++ programming language (3η έκδοση). Addison-Wesley. σελίδες 637-640. ISBN 0-201-88954-4. 
  2. 2,0 2,1 Stanley B. Lippman, Josee Lajoie (1999). C++ Primer (3η έκδοση). Massachusetts: Addison-Wesley. σελίδες 1063-1067. ISBN 0-201-82470-1.