====== Αλλαγή της θέσης ανάγνωσης ή εγγραφής στο stream ======
Τα //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// είναι οι εξής:
* **pos:** Απόλυτη θέση μέσα στο //stream// ξεκινώντας από την αρχή.
* **off:** Σχετική θέση μέσα στο //stream//. Συνδέεται με την τιμή της μεταβλητής **way**.
* **way:** Μπορεί να πάρει μία από τις παρακάτω τιμές
| **ios::beg** | αρχή του //stream// |
| **ios::cur** | τρέχουσα θέση του //stream// |
| **ios::end** | τέλος του //stream// |
Ακολουθούν δύο παραδείγματα αλλαγής της θέσης ανάγωσης και εγγραφής πάνω στο //file stream//.
#include
#include
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
#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 << "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";
}