User Tools

Site Tools


cpp:stream_random_io

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

fileseek.cpp
#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;  
}
filesize.cpp
#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";
}
cpp/stream_random_io.txt · Last modified: 2019/05/22 07:57 (external edit)