Τα streams εισόδου διατηρούν τη θέση ανάγνωσης και τα streams εξόδου τη θέση εγγραφής. Streams που υποστηρίζουν είσοδο και έξοδο διατηρούν ξεχωριστές θέσεις για ανάγνωση και για εγγραφή.
Η κλάση istream διαθέτει τη συνάρτηση tellg για την ανάγνωση της θέσης ανάγνωσης μέσα στο stream. Η συνάρτηση επιστρέφει ένα αντικείμενο του τύπου streampos και ορίζεται ως εξής:
streampos tellg();
Η κλάση ostream διαθέτει τη συνάρτηση tellp για την ανάγνωση της θέσης εγγραφής μέσα στο stream. Η συνάρτηση επιστρέφει ένα αντικείμενο του τύπου streampos και ορίζεται ως εξής:
streampos tellp();
Η κλάση istream διαθέτει τη συνάρτηση seekg για την αλλαγή της θέσης ανάγνωσης μέσα στο stream. Η συνάρτηση επιστρέφει μία αναφορά στο υφιστάμενο stream και ορίζεται ως εξής:
istream& seekg (streampos pos); istream& seekg (streamoff off, ios_base::seekdir way);
Η κλάση ostream διαθέτει τη συνάρτηση seekp για την αλλαγή της θέσης εγγραφής μέσα στο stream. Η συνάρτηση επιστρέφει μία αναφορά στο υφιστάμενο stream και ορίζεται ως εξής:
ostream& seekp (streampos pos); ostream& seekp (streamoff off, ios_base::seekdir way);
Οι παράμετροι που λαμβάνουν οι συναρτήσεις seekg και seekp είναι οι εξής:
ios::beg | αρχή του stream |
ios::cur | τρέχουσα θέση του stream |
ios::end | τέλος του stream |
Ακολουθούν δύο παραδείγματα αλλαγής της θέσης ανάγωσης και εγγραφής πάνω στο file stream.
#include <iostream> #include <fstream> using namespace std; int main (int argc, char *argv[]) { string filename; cout << "Enter output filename: "; cin >> filename; ofstream outfile(filename.c_str(), ios::trunc); if (!outfile.is_open()) { cout << "[Write] Unable to open " << filename; return -1; } outfile << "I hate pointers in C"; outfile.flush(); ifstream infile(filename.c_str()); if (!infile.is_open()) { cout << "[Read] Unable to open " << filename; return -1; } string line; getline( infile, line ); cout << line << endl; outfile.seekp(2); outfile << "love"; outfile.seekp(1, ios::cur); outfile << "references"; outfile.seekp(0,ios::end); outfile << "++" << endl; infile.seekg(0, ios::beg); getline( infile, line ); cout << line << endl; }
#include <iostream> #include <fstream> 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 << "Unable to open " << filename; return -1; } begin = file.tellg(); file.seekg (0, ios::end); end = file.tellg(); file.close(); cout << "file size is: " << (end-begin) << " bytes.\n"; }