cpp:stream_random_io

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
cpp:stream_random_io [2019/05/22 07:57]
cpp:stream_random_io [2019/05/22 08:57]
gthanos [Μεταβολή της θέσης ανάγνωσης ή εγγραφής]
Line 1: Line 1:
 +====== Αλλαγή της θέσης ανάγνωσης ή εγγραφής στο stream ======
 +
 +Τα //streams// εισόδου διατηρούν τη θέση ανάγνωσης και τα //streams// εξόδου τη θέση εγγραφής. //Streams// που υποστηρίζουν είσοδο και έξοδο διατηρούν ξεχωριστές θέσεις για ανάγνωση και για εγγραφή. 
 +
 +==== Ανάγνωση της θέσης ανάγνωσης ή εγγραφής ====
 +
 +Η κλάση //istream// διαθέτει τη συνάρτηση //tellg// για την ανάγνωση της θέσης ανάγνωσης μέσα στο //stream//. Η συνάρτηση επιστρέφει ένα αντικείμενο του τύπου //streampos// και ορίζεται ως εξής:
 +<code cpp>streampos tellg();</code>
 +
 +Η κλάση //ostream// διαθέτει τη συνάρτηση //tellp// για την ανάγνωση της θέσης εγγραφής μέσα στο //stream//. Η συνάρτηση επιστρέφει ένα αντικείμενο του τύπου //streampos// και ορίζεται ως εξής:
 +<code cpp>streampos tellp();</code>
 +
 +==== Μεταβολή της θέσης ανάγνωσης ή εγγραφής ====
 +
 +Η κλάση //istream// διαθέτει τη συνάρτηση //seekg// για την αλλαγή της θέσης ανάγνωσης μέσα στο //stream//. Η συνάρτηση επιστρέφει μία αναφορά στο υφιστάμενο //stream// και ορίζεται ως εξής:
 +<code cpp>istream& seekg (streampos pos);
 +istream& seekg (streamoff off, ios_base::seekdir way);</code>
 +
 +Η κλάση //ostream// διαθέτει τη συνάρτηση //seekp// για την αλλαγή της θέσης εγγραφής μέσα στο //stream//. Η συνάρτηση επιστρέφει μία αναφορά στο υφιστάμενο //stream// και ορίζεται ως εξής:
 +<code cpp>ostream& seekp (streampos pos);
 +ostream& seekp (streamoff off, ios_base::seekdir way);</code>
 +
 +Οι παράμετροι που λαμβάνουν οι συναρτήσεις //seekg// και //seekp// είναι οι εξής:
 +  * **pos:** Απόλυτη θέση μέσα στο //stream// ξεκινώντας από την αρχή.
 +  * **off:** Σχετική θέση μέσα στο //stream//. Συνδέεται με την τιμή της μεταβλητής **way**.
 +  * **way:** Μπορεί να πάρει μία από τις παρακάτω τιμές
 +
 +|  **ios::beg**  | αρχή του //stream// |
 +|  **ios::cur**  | τρέχουσα θέση του //stream// |
 +|  **ios::end**  | τέλος του //stream// |
 +
 +Ακολουθούν δύο παραδείγματα αλλαγής της θέσης ανάγωσης και εγγραφής πάνω στο //file stream//
 +
 +<code cpp 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;  
 +}</code>
 +
 +<code cpp 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";
 +}
 +</code>
 +
  
cpp/stream_random_io.txt · Last modified: 2019/05/22 07:57 (external edit)