How to Read and Write Bits to a File in C++

How to Read and Write Bits to a File in C++

In C++, processes like the compression of a text file require reading and writing the bits to a file. In this tutorial, you will learn how to read or write bits to a file without any errors in C++.

The istream and ostream, as a destructor, play a crucial part when reading and writing bits to a file is required.

However, it may require writing bits into a binary output file while encoding through the Huffman tree in Huffman coding, and instead of using the streams, you can pack the Booleans into chunks of 8 bits and then write the bytes.

Use iStream and oStream to Read and Write Bits to a File in C++

The BitInputStream class contains the iStream and oStream features to read and write bits. As the ifstream and ofstream can open binary files by attaching streams to a physical file name, they are also crucial to read or write bits to a file.

Additionally, open member functions of a target BitInputStream class can provide arguments (optional arguments) that are not described in common.

The ostream is one of the open member functions that causes n bytes to be written from the memory location and transfers the pointer ahead of the n bytes.

The fstream stream class is highly functional than any other stream class because of its ability to both read and write from/to files.

It’s not important for file streams to read and write operations in binary only because they are opened in binary mode; instead, they can perform read/write operations of any form of consideration.

#include <fstream>
#include <iostream>  // reflects `istream` and `ostream`

// optional
using namespace std;

// struct declaration
struct army_per {
  // an entity that reflects three attributes
  int ref_no;
  string rank, name;

// primary class
int main() {
  // declaration of `ofstream` for read/write `army_per` file
  ofstream wf("army_per.dat", ios::out | ios::binary);

  if (!wf) {
    cout << "Unable to open the file!" << endl;
    return 1;

  // entity declaration
  army_per soldier[2];

  // first entry
  soldier[0].ref_no = 1;
  soldier[0].name = "Rob";
  soldier[0].rank = "Captain";

  // second entry
  soldier[1].ref_no = 2;
  soldier[1].name = "Stannis";
  soldier[1].rank = "Major";

  for (int i = 0; i < 2; i++) wf.write((char *)&soldier[i], sizeof(army_per));


  if (!wf.good()) {
    cout << "Error: bits writing time error!" << endl;
    return 1;

  ifstream rf("army_per.dat", ios::out | ios::binary);

  if (!rf) {
    cout << "File is not found!" << endl;
    return 1;

  army_per rstu[2];
  for (int i = 0; i < 2; i++) *)&rstu[i], sizeof(army_per));


  if (!rf.good()) {
    cout << "Error: bits reading time error occured!" << endl;
    return 1;

  cout << "Army Div-32 details:" << endl;

  for (int i = 0; i < 2; i++) {
    // access the elements of the object and output the result of each
    // individual
    cout << "Reference No: " << soldier[i].ref_no << endl;
    cout << "Name: " << soldier[i].name << endl;
    cout << "Rank: " << soldier[i].rank << endl;
    cout << endl;
  return 0;


Army Div-32 details:
Reference No: 1
Name: Rob
Rank: Captain

Reference No: 2
Name: Stannis
Rank: Major

Generally, it’s believed that cin and cout belong to ostream in C++, but the cin object (as a global object) belongs to the istream class.

Furthermore, the file stream, which includes; ifstream and ofstream, are inherited from istream and ostream, respectively.

Programmers should be aware that the buffer is always greater than the data it is supposed to hold. In C++, the chances of decreasing your program’s reliability can increase in case of un-checked or solved errors, and make sure that no file operations cause the program to stop.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.


Related Article - C++ File