C++ Tutorial Index

C++ Tutorial C++ History C++ Installation C++ First Program C++ cin and cout C++ Data type C++ Variable C++ operator C++ Keywords

C++ Control Statements

C++ If C++ Nested if C++ If-else C++ If-else-if C++ Switch C++ Break C++ Continue C++ Goto C++ For loop C++ While loop C++ Do while loop

C++ Functions

C++ Call by Value C++ Call by Reference C++ Recursion Function C++ Inline function C++ Friend function

C++ Arrays

Single dimension array Two dimension array

C++ Strings

C++ Strings

C++ Inheritance

C++ Inheritance Single level Inheritance Multilevel Inheritance Multiple Inheritance Hierarchical Inheritance Hybrid Inheritance

C++ Polymorphism

C++ Polymorphism C++ Overloading C++ Overriding C++ Virtual Function

C++ Pointers

C++ Pointers C++ this pointer

C++ Exception Handling

C++ Exception Handling

C++ Constructors

C++ Constructors Default Constructor Parameterize Constructor Copy constructor Constructor Overloading Destructor

C++ File Handling

C++ File Handling C++ Writing to file C++ Reading file C++ Close file

Miscellaneous

C Vs C++ C++ Comments C++ Data Abstraction C++ Identifier C++ Memory Management C++ Storage Classes C++ Void Pointer C++ Array To Function C++ Expressions C++ Features C++ Interfaces C++ Encapsulation std::min in C++ External merge sort in C++ Remove duplicates from sorted array in C++ Precision of floating point numbers Using these functions floor(), ceil(), trunc(), round() and setprecision() in C++ C++ References C++ Friend Functions C++ Mutable keyword Unary Operators in C++ Initialize Array of objects with parameterized constructors in C++ Differences between #define & const in C/C++ C++ Program to Implement Shell Sort C++ Program to Implement Merge Sort Storage Classes in C Vector resize() in C++ Passing by Reference Vs. Passing by the pointer in C++ Free vs delete() in C++ goto statement in C and C++ C++ program to read string using cin.getline() C++ String Concatenation Heap Sort in C++ Swap numbers in C++ Input Iterators in C++ Fibonacci Series in C++ C ++ Program: Alphabet Triangle and Number Triangle C++ Program: Matrix Multiplication C++ Program to Print Fibonacci Triangle Stack in C++ Maps in C++ Queue in C++ C++ Bitset C++ Algorithms Priority Queue in C++ C++ Multimap C++ Deque Function Pointer in C++ Sizeof() Operators in C++ C++ array of Pointers free() Vs delete in C Timsort Implementation Using C++ CPP Templates C++ Aggregation C++ Enumeration C++ Math Functions C++ Object Class C++ Queue Initialize Vector in C++ Vector in C++ C++ STL Components Function overloading in C++ C++ Maximum Index Problem C++ find missing in the second array C++ Program to find the product array puzzle C++ Program To Find Largest Subarray With 0 Sum C++ Program To Move All Zeros To The End Of The Array C++ Program to find the element that occurs once C++ Program to find the largest number formed from an array Constructor Vs Destructor C++ Namespaces C++ OOPs Concept C++ Static C++ Structs C++ Try-Catch C++ User Defined Exceptions C++ Virtual Destructor C++ vs C# Malloc() and new in C++ Palindrome Number Program in C++ Snake Code in C++ Splitting a string in C++ Structure Vs Class in C++ Virtual Function Vs Pure Virtual Function C++ Bidirectional Iterators C++ Forward Iterators C++ Iterators C++ Output Iterators C++ Range-based For Loop Converting string into integer in C++ LCM Program in C++ Type conversion in C++ Add two numbers using the function in C++ Advantage and disadvantage friend function C++ Armstrong Number Program in C++ ATM machine program in C++ using functions Binary to Decimal in C++ Bit Manipulation in C++ C++ Constructor C++ Dijkstra Algorithm Using the Priority Queue C++ int into String C++ Signal Handling Decimal to Binary in C++ Decimal to Hexadecimal in C++ Decimal to Octal in C++ Factorial Program in C++ Function in C++ Hexadecimal to Decimal in C++ Octal to Decimal in C++ Reverse a Number in C++ Structure Vs Class in C++ C++ Forward Iterators C++ Output Iterators C++ Prime number program Char Array to String in C++ Constructor Overloading in C++ Default arguments in C++ Different Ways to Compare Strings in C++ Dynamic Binding in C++ Program to convert infix to postfix expression in C++ SET Data Structure in C++ Upcasting and Downcasting in C++ Reverse an Array in C++ Fast Input and Output in C++ Delete Operator in C++ Copy elision in C++ C++ Date and Time C++ Bitwise XOR Operator Array of sets in C++ Binary Operator Overloading in C++ Binary Search in C++ Implementing the sets without C++ STL containers Scope Resolution Operator in C++ Smart pointers in C++ Types of polymorphism in C++ Exception Handling in C++ vs Java Const Keyword in C++ Type Casting in C++ Static keyword in C++ vs Java Inheritance in C++ vs Java How to concatenate two strings in C++ Programs to Print Pyramid Patterns in C++ swap() function in C++ Structure of C++ Program Stringstream in C++ and its applications rand() and srand() in C / C++ C++ Ternary Operator C++ Scope of Variables While Loop Examples in C++ Star pattern in C++ using For Loops For Loop Examples in C++ Do-While Loop Examples in C++ Top 5 IDEs for C++ That You Should Try Once Assertions in C/C++ C++ Convert Int to String Continue in C++ While loop Diamond Pattern in C++ using For Loop How to Reverse a String in C++ using Do-While Loop How to Reverse a String in C++ using For Loop How to Reverse a String in C++ using While Loop Infinite loop in C++ Loops in C++ Returning Multiple Values from a Function using Tuple and Pair in C++ wcscpy(), wcslen(), wcscmp() Functions in C++ Auto keyword in C++ C++ 11 vs C++ 14 vs C++ 17 C++ STL (Standard Template Library) Differences Between C Structures and C++ Structures Divide by Zero Exception in C++ Dynamic Constructor in C++ Dynamic Memory Allocation in C++ Find the Size of Array in C/C++ without using sizeof() function Floating Point Operations and Associativity in C, C++ and Java Hello World Program in C++ How to create a table in C++ How to Setup Environment for C++ Programming on Mac Implementation of a Falling Matrix in C++ Message Passing in C++ Pointer to Object in C++ Templates in C++ vs Generics in Java Ways to Copy a Vector in C++ What does Buffer Flush mean in C++ sort() function in C++ Structure Sorting (By Multiple Rules) in C++ Similarities between C++ and Java std::distance in C++ Array program in C++ C++ Tricks for Competitive Programming Desired Capabilities in Selenium Web Driver in C++ Socket Programming in C++ Template Specialization in C++ Classes and Objects in C++ Convex hull Algorithm in C++ DES in C++ C++ vardiac() function Difference between Two Sets in C++ Difference between Exit and Return Structured Binding in C++ Differences between Local and Global Variable Bitwise Operator vs Logical Operator Difference between OOP and POP in C++ Fork in C++ Functors in C++ How to call a void function in C++ How to create a directory or folder in C/C++ How to create a library in C++ How to create a stack in C++ How to create the Processes with Fork in C++ How to Handle Divide by Zero Exception in C++ Lambda Expression in C++ Pattern programs in C++ Roadmap to C++ Programming Substring in C++ Virtual base class in C++ Bits stdc++.h in C++ Top 14 Best Free C++ IDE (Editor & Compiler) for Windows in 2022 Bitmasking in C++ Auto Keyword in C++ Features of OOPS in C++ Hospital Management Project in C++ How to Declare Unordered Sets in C++ How to Sort an Array in C++ Include Guards in C++ Iostream in C++ Method overriding in C++ How to run program in turbo c++ How to Use Getline in C++ Leap Year Program in C++ Naming Convention in C++ New Operator in C++ Nullptr in C++ Object Slicing in C++ Principles of Object-Oriented Programming in C++ Processing strings using std string stream in C++ Pure Virtual Function in C++ With Example Program Random Number Generator in C++ Singleton Design Pattern in C++ Size_t Data Type in C++ Skyline Problem in C++ System() function in C++ Web Development in C++ Data Hiding in C++ Difference between exit() and _Exit() in C++ Hashing in C++ Object in C++ Sum of all Elements between k1’th and k2’th Smallest Elements Virtual class in C++ Vector Size in C++ Top best IDEs for C/C++ Developers in 2022 Tensorflow in C++ Sliding Window Technique in C++ Reverse String Word-Wise in C++ Returning a Function Pointer from a Function in C/C++ RTTI in C++ Pthreads or POSIX Threads in C++ Reserved Keywords in C++ Passing a Vector to a function in C++ 10 Best C and C++ Books for Beginners & Advanced Programmers Add two numbers represented by two arrays in C++ Array of Object in C++ C++ Program For FCFS Containership in C++ Counting Frequencies of Array Elements in C++ Decltype type Specifier in C++ Dynamic _Cast in C++ Difference between int main() and int main(void) in C/C++ Depth First Search Program to Traverse a Graph in C++ Features and Use Of Pointers in C/C++ Fread Function in C++ Programming Fscanf Function in The C++ Functions in C++ With Types and Examples Gmtime Function in C/C++ How is Multiset Implemented in C++ How to Build a Program in C++ How to Declare a 2d Array Dynamically in C++ inheritance Program in C++ int Max and int Min in C/C++ is It Fine to Write Void Main Or Main in C/C++ How to create a button in C++ abs() function in C++ Compile Time Polymorphism in C++ Division in C++ Factorial of a Number in C++ using while Loop Multiset in C++ 4 Pillars of OOPs Approach in C++ Backtracking Time Complexity in C++ C++ Global Variable C++ Pipe Tutorial Observer Design Pattern in C++ Private Inheritance in C++ Pthread in C++ Parameters SDL library in C++ with Examples Pointers in C++ Abstract Factory Design Pattern in C++ Ascending order in C++ How the value is passed in C++ Call by Pointer in C++ Constexpr in C++ Deadlock in C++ Design Patterns in C++ Factory Method for Designing Pattern in C++ How to calculate size of string in C++ Name Mangling and extern in C++ Preventing Object Copy in C++ Program that produces different results in C and C++ Quick Sort in C++ Single Handling in C++ Type difference of Character literals in C VS C++ Use of Inheritance in C++ User-defined literals in C++ Vector methods in C++ Void * in C and C++ Zombie and Orphan Process in C++ Isprint() in C++ List and Vector in C++ List iterators in C++ Merging Two Vectors in C++ Sleep function in C++ Stoi function in C++ String erase() in C++ String Trim in C++ When should we write own Assignment operator in C++ C++ tcp client server example C++ tcp server example Early Binding and Late Binding in C++ Factory Design Pattern in C++ Fisher-Yates shuffle algorithm in C++ For Auto in C++ Group anagrams in C++ How to convert binary string to int in C++ How to convert string to float in C++ How to remove space from string in C++ How to use pair in C++ How to use the string find() in C++ Dynamic Casting in C++ 2D Vector Initialization in C++ C++ GUI Visual Studio C++ IPC C++ Macro Function Example C++ Permutation Overloading Stream Insertion in C++ Overloading array Index operator in C++ Operators that cannot be overloaded in C++ Operator overloading in C++ isprint() function in c++ Is_trivial function in C++ Is assignment operator Inherited in C++ div() function in C++ Default Assignment Operator and References in C++ Copy Constructor vs Assignment Operator in C++ Conversion Operator in C++ Array sum in C++ STL C++ Define Macro C++ Design C++ Factory Pattern TCP Client Server Example in C++ Convert String to Uppercase in C++ exit() and _Exit() in C and C++ Initializer list in C++ Iterator invalidation in C++ Lower bound in C++ Modulus of Two float numbers or double number Pass by value in C++ Set insert function in C++ Std partition_point in C++ Unary Operator Overloading in C++ Using Default Arguments with Virtual Functions Virtual Functions and Runtime Polymorphism What is endl in C++ What is Unary Operator Overloading in C++ Which operators cannot be overloaded in C++ C++ Program to Divide the String Into N equal Parts Gray Code to Binary Code in C++ How to get the value of pi in C++ Multimap value_comp() function in C++ Vector of Vectors in C++ Naïve Bayes Algorithm in C++ Minimum Cost Path Problem in C++ 10 C++ Programming Tricks You Should Know btowc() function in C++ forward_list::cend() in C++ Unordered_multimap max_load_factor() function in C++ Cpp_int in c++ Dynamic Objects in C++ FLOCK() FUNCTION IN C++ Generate Random Double Numbers in C++ How to Assign Infinity to a Number in C++ Jump statements in C++ Multipath inheritance in C++ Out of Range Exception in C++ Size of Class in C++ Size of string in C++ std::binary_negate in c++ Thread_local in C++ Tokenizing a String in C++ Ancestors of a Node in Binary Search Tree C++ program for Double to String Conversion C++ Program to Demonstrate Use of Formatting Flags on Float Output Clamp in C++ K-Dimensional Tree in C++ Mutable Lambda in C++ Power Set in C++ Program to Find Sum of Geometric Progression Std::Back_inserter in C++ Strpbrk() function in C++ Size of int in C++ TYPES OF MANIPULATORS IN C++ Double colon in C++ How to sort vector in C++ How to use Setprecision in C++ How to write a Vector in C++ Insertion in Splay Tree in C++ Merge Sort Algorithm in C++ Printing a Character using ASCII value in C++ Regex in C++ Size of Data Types in C++ Abstract Factory Design Pattern in C++ Sqrtf() function in C++ Static Casting in C++ Using Range in Switch Case in C++ wcstoimax() and wcstoumax() function in C++ What is float in C++ What is the Diamond Problem in C++ Best way to learn C++ ios setstate() function in C++ Nested Namespace in C++ Single Inheritance in C++ std::fixed, std::scientific, std::hexfloat, std::defaultfloat in C++ StringStream in C++ for Decimal to Hexadecimal and back The OFFSETOF() macro in C++ Difference between std::next and std::advance in C++ Hiding of all overloaded methods with same name in base class in C++ C++ program to concatenate two strings using operator overloading Difference between array::fill() and array::swap() in C++ Difference between Friend Function and Virtual Function in C++ Semaphores in C++ Seekg in C++ UDP server- client implementattion in C++ What is long long in C++ CSV file management using C++ Toggle bits of a number except first and last bits in C++ Trailing Return Type C++ 11 Binary search implementation in C++ Different Versions of C++ What is Cascading in C++ Background Colour in C++ BOOL DATATYPE IN C++ BIT VECTORS IN C++

Seekg in C++

Introduction to Seekg in C++

The C++ function ‘seekg’ falls under input stream manipulation. Input streams, like file streams, are typically used to set the position of the input stream to a certain position within the stream. When working with files, this Function from the Standard Template Library (STL) is frequently used to browse content rapidly.

Whether you're working with file streams or standard input/output streams, you can find the ‘seekg’ function in the header files ‘iostream>’ and ‘fstream>’.

Syntax of Seekg:

Here's the basic syntax of the seekg Function:

istream& seekg (streampos position);

istream& seekg (stream off offset, ios_base::seekdir way);
  • Position: The file pointer should be set to this absolute location inside the stream.
  • Offset: This option designates a point inside the stream that is relative.
  • Way: It specifies the direction in which you wish to relocate the file pointer about your present location or the start of the stream. One of the following values may apply to it:
  • ios_base::beg (beginning of the stream)
  • ios_base::cur (current position in the stream)
  • ios_base::end (end of the stream)

A reference to the input stream (istream&) on which it was called is returned by the seekg Function. You can chain together different stream operations with this.

Common Use Cases of Seekg

In C++, the seeking Function is frequently used for a variety of tasks, including

  • Reading Particular Sections of a File: You should avoid reading the full File while working with huge files. Instead, you can read data from a specified location by moving the file pointer using ‘seekg’.
  • Random Access: To move to a specific record or data point in a file without reading everything that comes before it, ‘seekg’ is necessary for files that support random access (like binary files).
  • Parsing Structured Data: If a file, such as a database or configuration file, contains structured data, you can use ‘seekg’ to go to particular sections or records.
  • Error Handling: ‘seekg’ helps handle reading-related errors in files. Use seekg to move the file pointer to a known good spot and go on reading from there if you run into problems when reading a file.

Example 1: Use of seekg in Basic:

Let's start with a straightforward example to learn how to use seekg to read data from a file at a given location. Create a text file with some content for this example, and then use seekg to read from various locations inside the File.

#include <iostream>

#include <fstream>

using namespace std;

int main() {

    // Create and open a text file for reading

    ifstream inputFile("sample.txt");

    // Check if the File is opened successfully

    if (!inputFile) {

        cerr << "Failed to open the file." << endl;

        return 1;

    }

    // Set the file pointer to the beginning of the File (position 0)

    inputFile.seekg(0);

    // Read and print the first 100 characters

    char buffer[101];  // 100 characters + null terminator

    inputFile.read(buffer, 100);

    buffer[100] = '\0';  // Null-terminate the string

    cout << "First 100 characters: " << buffer << endl;

    // Set the file pointer to position 200

    inputFile.seekg(200);

    // Read and print the next 50 characters

    inputFile.read(buffer, 50);

    buffer[50] = '\0';  // Null-terminate the string

cout << "Next 50 characters: " << buffer << endl;

    // Close the File

    inputFile.close();

    return 0;

}

In this instance:

  • Using ifstream, we open the "sample.txt" text file for reading.
  • We verify that the File was successfully opened. If not, we quit after printing an error notice.
  • To set the file pointer to the File's beginning, we use ‘seekg(0)’.
  • We publish the first 100 characters that we read from the File.
  • The file pointer is set to position 200 using ‘seekg(200)’.
  • The next 50 characters are read from the File and printed.

This example shows how seekg enables selective data reading by allowing us to shift the file pointer to particular locations inside the File.

Example 2: Binary File Seek:

Binary File, as an example with binary files, where you might need to hop to specified points to retrieve structured data, seek ‘seekg’ is also frequently used. Here is an illustration involving a binary file that contains student records.

#include <iostream>

#include <fstream>

using namespace std;

// Define a structure for student records

struct StudentRecord {

    int rollNumber;

    char name[50];

    double marks;

};

int main() {

    // Create and open a binary file for reading

    ifstream binaryFile("students.dat", ios::binary);

    // Check if the File is opened successfully

    if (!binaryFile) {

        cerr << "Failed to open the file." << endl;

        return 1;

    }

    // Function to read and display a student record

    auto displayStudent = [](const StudentRecord& student) {

        cout << "Roll Number: " << student.rollNumber << endl;

        cout << "Name: " << student.name << endl;

        cout << "Marks: " << student.marks << endl;

        cout << "-------------------" << endl;

    };

    // Set the file pointer to the beginning of the File

    binaryFile.seekg(0);

    // Read and display the first student record

    StudentRecord student1;

    binaryFile.read(reinterpret_cast<char*>(&student1), sizeof(StudentRecord));

    displayStudent(student1);

    // Set the file pointer to the third student record

    binaryFile.seekg(2 * sizeof(StudentRecord));

    // Read and display the third student record

    StudentRecord student3;

    binaryFile.read(reinterpret_cast<char*>(&student3), sizeof(StudentRecord));

    displayStudent(student3);

    // Close the File

    binaryFile.close();

    return 0;

}

In this instance:

  • To represent student records, which comprise a roll number, name, and grades, we construct a ‘StudentRecord’ structure.
  • We use ifstream to open the "students.dat" binary File for reading and specify that it is a binary file by using the ‘ios::binary’ flag.
  • As in the previous example, we determine whether the File was successfully opened.
  • To display the contents of a ‘StudentRecord’, we define the lambda function displayStudent.
  • To read the first student record, we use ‘seekg(0)’ to set the file pointer to the File's beginning.
  • To read the third student record, we set the file pointer to that place using ‘seekg(2 * sizeof(StudentRecord))’.
  • We close the binary File at the end.

This example shows how to efficiently read structured data using seekg to browse specified locations within a binary file.

‘tellg’ Function:

It's crucial to comprehend the ‘tellg’ function before delving further into ‘seekg’. The file pointer's current location within an input stream can be found with the command ‘tellg’. This is helpful when you wish to save the position before using ‘seekg’ and later return to that location.

Syntax of tellg:

The ‘tellg’ syntax is as follows:

streampos tellg();
  • The ‘streams’ object that ‘telling’ returns as the current position of the file pointer denotes the location inside the stream.

Let's revise the preceding illustration to show how to record the File's current location and then go back to it using the ‘tellg’ command.

#include <iostream>

#include <fstream>

using namespace std;

// Define a structure for student records

struct StudentRecord {

    int rollNumber;

    char name[50];

    double marks;

};

int main() {

    // Create and open a binary file for reading

    ifstream binaryFile("students.dat", ios::binary);

    // Check if the File is opened successfully

    if (!binaryFile) {

        cerr << "Failed to open the file." << endl;

        return 1;

    }

    // Function to read and display a student record

    auto displayStudent = [](const StudentRecord& student) {

        cout << "Roll Number: " << student.rollNumber << endl;

        cout << "Name: " << student.name << endl;

        cout << "Marks: " << student.marks << endl;

        cout << "-------------------" << endl;

    };

    // Get and store the current position

    streampos initialPosition = binaryFile.tellg();

    // Set the file pointer to the beginning of the File

    binaryFile.seekg(0);

    // Read and display the first student record

    StudentRecord student1;

    binaryFile.read(reinterpret_cast<char*>(&student1), sizeof(StudentRecord));

    displayStudent(student1);

    // Return to the initial position

    binaryFile.seekg(initialPosition);

    // Read and display the second student record

    StudentRecord student2;

    binaryFile.read(reinterpret_cast<char*>(&student2), sizeof(StudentRecord));

    displayStudent(student2);

    // Close the File

    binaryFile.close();

    return 0;

}

In this example:

We use the' tell' command to obtain the file pointer's current position and store it in the ‘initial position’ variable.

We utilize ‘seeking’ to return to the ‘initial position’ after reading the first student record and then reading the second student record.

We can efficiently change the file pointer and then return to the original location while maintaining the integrity of the file reading process by combining ‘tellg’ and ‘seekg’.

‘seekg’ with Relative Positions

We have been using ‘seekg’ with absolute file positions up to this point. Moving the file pointer relative to its present location or the File's end is frequently more practical, though. This is especially helpful if you need to skip a specific number of bytes or seek to the File's end but need to know the absolute position.

Let's make an example where we use ‘seekg’ and relative placement to show this.

#include <iostream>

#include <fstream>

using namespace std;

int main() {

    // Create and open a binary file for reading

    ifstream binaryFile("data.bin", ios::binary);

    // Check if the File is opened successfully

    if (!binaryFile) {

        cerr << "Failed to open the file." << endl;

        return 1;

    }

    // Read and display the first integer from the File

    int firstInt;

    binaryFile.read(reinterpret_cast<char*>(&firstInt), sizeof(int));

    cout << "First integer in file: " << firstInt << endl;

    // Use seekg to move the file pointer 4 bytes ahead (to the second integer)

    binaryFile.seekg(4, ios::cur);

    // Read and display the second integer

    int secondInt;

    binaryFile.read(reinterpret_cast<char*>(&secondInt), sizeof(int));

    cout << "Second integer in file: " << secondInt << endl;

    // Use seekg to move the file pointer 8 bytes before the end of the file

    binaryFile.seekg(-8, ios::end);

    // Read and display the last double in the File

    double lastDouble;

    binaryFile.read(reinterpret_cast<char*>(&lastDouble), sizeof(double));

    cout << "Last double in file: " << lastDouble << endl;

    // Close the File

    binaryFile.close();

    return 0;

}

In this instance:

  • For reading, we open a binary file called "data.bin".
  • The File's first integer is read and displayed.
  • We skip the second integer by moving the file pointer 4 bytes forward using 'seekg(4, ios::cur)’.
  • The second integer is read and shown.
  • To change the file pointer 8 bytes before the File's end, we use ‘seekg(-8, ios::end)’.
  • The last double in the File is read and shown.

This example shows how to traverse through a file using ‘seekg’ using relative positions based on the current position or relative to the File's end.

Seekable File Types

The kind of File determines whether you may search within it. Text and binary files are the two broad categories into which seekable file types can be classified.

1. Text files:

Text files may usually be searched for. A text file pointer can be moved around using the ‘seekg’ command. However, when working with multibyte character encodings, the fact that seeking in a text file is based on characters rather than bytes might need to be revised.

2. Binary Files:

When exact byte-level control is required, binary files are frequently the best option because they are also seekable. Within a binary file, ‘seekg’ can be used to relocate the file pointer to a certain number of bytes.

Combining ‘seekg’ and ‘tellg’

When reading data from a file, you occasionally need to maintain track of where you are in the File. In these situations, the use of ‘seekg’ and ‘tellg’ together can be very effective.

Let's write a sample program that reads a file with a straightforward record structure and prints the records together with their locations in the File.

#include <iostream>

#include <fstream>

using namespace std;

// Define a structure for a record

struct Record {

    int id;

    char name[50];

};

int main() {

    // Create and open a binary file for reading

    ifstream binaryFile("records.bin", ios::binary);

    // Check if the File is opened successfully

    if (!binaryFile) {

        cerr << "Failed to open the file." << endl;

        return 1;

    }

    //Function to read and display a record

    auto displayRecord = [](const Record& record, streampos position) {

        cout << "Position: " << position << endl;

        cout << "ID: " << record.id << endl;

        cout << "Name: " << record.name << endl;

        cout << "-------------------" << endl;

    };

    // Read and display records along with their positions

    streampos currentPosition;

    while (true) {

        currentPosition = binaryFile.tellg(); // Get the current position

        Record record;

        binaryFile.read(reinterpret_cast<char*>(&record), sizeof(Record));

        // Check for end of File

        if (binaryFile.eof()) {

            break;

        }

        displayRecord(record, currentPosition);

    }

    // Close the File

    binaryFile.close();

    return 0;

}

In this example:

  • We read from a binary file called "records.bin"
  • We define a Record structure to represent a record in the File consisting of an ID and a name.
  • To display a record with its location in the File, we define the lambda function ‘displayRecord’.
  • Before reading each record inside the loop, we use ‘tellg’ to get our current location.
  • Using ‘eof()’, we read a record and verify that the File is at its conclusion.
  • We end the loop if the File's end is reached.
  • If not, the record and its location in the File are shown.

This example shows how to read records from a file while keeping track of their locations using ‘seekg’ in conjunction with ‘tellg’.

Seekable and Non-seekable Streams

Some input streams do not allow for searching operations. Depending on the type of stream and its underlying source, you may or may not be able to utilize ‘seekg’ on a certain stream. The following are some general principles:

  • File Streams (ifstream): ‘ifstream’ allows the creation of seekable file streams. The file pointer can be set using ‘seekg’ to various locations inside the File.
  • Standard Input (cin): It is impossible to seek in the standard input stream (‘cin’). The file pointer cannot be moved within standard Input using ‘seekg’.
  • Standard Output Stream (cout): ‘cout’ is not a seekable standard output stream. The file pointer cannot be moved within standard output using ‘seekg’.
  • String Streams (istringstream): String streams built with ‘istringstream’ are not seekable (‘istringstream’). The file pointer cannot be moved within a string stream using ‘seekg’.
  • Custom Streams: Depending on how it is implemented, a custom stream (such as a network stream or a custom data source) may or may not be seekable. To determine if the custom stream class supports searching, consult its documentation or source code.

It's a good idea to use ‘seekg’ in conjunction with ‘tellg’ to look for problems or the ‘tellg’ return value before using ‘seekg’ to ensure that the stream you're working with supports seeking. If seeking is not supported, using ‘seekg’ could produce unexpected results.

Typical Mistakes & Pitfalls

There are certain frequent mistakes and problems to be mindful of while using ‘seekg’ in C++:

  • File Existence: Before opening a file, always ensure it already exists. Runtime errors may occur if this needs to be done.
  • File Open Mode: Make sure to open the File in the appropriate mode (for example, binary mode for binary files). A file opened in the incorrect mode may behave unexpectedly.
  • Bounds Checking: Exercise caution when using ‘seekg’ to relocate the file pointer. Avoid seeking outside the File's boundaries to avoid errors or behavior that isn't defined.
  • Error handling: After using ‘seekg’, always look for errors. To ascertain whether the seek operation was successful, use ‘fail()’ or look at the ‘tellg’ return value.
  • Byte vs Character Offset: In text files, ‘seekg’ works with characters rather than bytes. This can produce unexpected search results if you're using multibyte character encodings.
  • Non-Seekable Streams: Not all input streams can be searched. Errors may occur if ‘seekg’ is used on streams that can't be searched.
  • Concurrency: When using ‘seekg’ and reading from a file, be aware of synchronization to prevent race situations if many threads or processes access the same File.

Conclusion

When working with files, the ‘seekg’ function in C++ effectively modifies the file pointer within input streams. You can navigate to particular locations inside a file, skip data, and read data when you want to. You can maintain track of where you are in the File and go back to prior positions by combining the commands seek and tell.

When using ‘seekg’, remember to handle errors, check for seek ability, and utilize the proper file modes. You can read and process files in your C++ programs more quickly and precisely if you know how to use ‘seekg’ properly.