====== Αλλαγή της θέσης ανάγνωσης ή εγγραφής στο 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"; }