Seekg

Last updated

In the C++ programming language, seekg is a function in the fstream library (part of the standard library) that allows you to seek to an arbitrary position in a file. This function is defined for ifstream class - for ofstream class there's a similar function seekp (this is to avoid conflicts in case of classes that derive both istream and ostream, such as iostream).

istream&seekg(streamposposition);istream&seekg(streamoffoffset,ios_base::seekdirdir);

dir is the seeking direction. It is an object of type ios_base::seekdir that can take any of the following constant values:

  1. ios_base::beg (offset from the beginning of the stream's buffer).
  2. ios_base::cur (offset from the current position in the stream's buffer).
  3. ios_base::end (offset from the end of the stream's buffer).

Note: If you have previously got an end of file on the stream, seekg will not reset it but will return an error in many implementations. - use the clear() method to clear the end of file bit first. This is a relatively common mistake and if seekg() is not performing as expected, it is wise to clear the fail bit, as shown below.

Example of seekg

#include<fstream>#include<iostream>intmain(){// Open a new file for input/output operations discarding any current// content in the file (assumes a length of zero on opening)std::fstreammyFile("test.txt",std::ios::in|std::ios::out|std::ios::trunc);// Add the characters "Hello World" to the filemyFile<<"Hello World";// Seek to 6 characters from the beginning of the filemyFile.seekg(6,std::ios::beg);// Read the next 5 characters from the file into a buffercharbuffer[6];myFile.read(buffer,5);// End the buffer with a null terminating characterbuffer[5]=0;// Output the contents read from the file and close it std::cout<<buffer<<std::endl;myFile.close();}

Example clearing the fail bit

#include<fstream>#include<iostream>#include<string>intmain(){std::stringline;// Creates a new ifstream object and associates it with a file passed in via the parameters.// The object is then checked to see if the end-of-file has been reached, if the file has data// then this will be false.std::ifstreammyFile(argv[1],std::ios::in);std::cout<<myFile.eof()<<std::endl;// Continuously loops over each line of the file until the end of the filewhile(!myFile.eof()){std::getline(myFile,line);}// Again outputs the end-of-file status for the stream, this time the answer will be truestd::cout<<myFile.eof()<<std::endl;// Seeks to the very beginning of the file, clearing any fail bits first (such as the end-of-file bit)myFile.clear();myFile.seekg(0,std::ios::beg);// Outputs the status of the stream again, the result will be falsestd::cout<<myFile.eof()<<std::endl;myFile.close();}