Codecademy Logo

Streams in C++

Related learning

  • Learn advanced C++ programming with preprocessor directives, operator overloading, streams, and lambda expressions.
    • With Certificate
    • Advanced.
      9 hours

C++ Streams Basics

C++ streams offer a unified way to perform input and output operations, whether reading from a file or writing to a console. By using streams, you can handle various data sources with the same syntax, simplifying your code and increasing its adaptability.

#include <iostream>
#include <fstream>
int main() {
std::ifstream inputFile("example.txt");
std::string line;
if (inputFile.is_open()) {
while (getline(inputFile, line)) {
std::cout << line << std::endl;
}
inputFile.close();
} else {
std::cerr << "Unable to open file" << std::endl;
}
return 0;
}

C++ Stream Hierarchy

Understand the stream class hierarchy in C++. The ios class is the base for the istream and ostream classes, which handle input and output separately. The iostream class combines these functions, allowing both input and output operations on the same stream. This structure is essential for efficient data handling in C++.

#include <iostream>
int main() {
std::string name;
std::cout << "Enter your name: ";
std::cin >> name;
std::cout << "Hello, " << name << "!";
return 0;
}

C++ Stream Buffers

In C++, streambuf and its derivatives handle data transfer between your program and external devices. They abstract the complexities of input and output operations, managing data as streams. Understanding how to utilize streambuf can improve your application’s I/O performance.

#include <iostream>
#include <streambuf>
int main() {
std::streambuf* pbuf;
std::ifstream input("example.txt");
pbuf = input.rdbuf(); // Get associated stream buffer
std::cout << "Stream buffer obtained for input operations.\n";
char ch;
// Display file contents
while(pbuf->sgetc() != EOF) {
ch = pbuf->sbumpc();
std::cout << ch;
}
input.close();
}

C++ Output Streams

Using C++, the ostream class and insertion operator (<<) allow you to send data to different outputs. They’re integral for printing text to the console.

#include <iostream>
using namespace std;
int main() {
ostream& outPut = cout;
outPut << "Hello, World!";
return 0;
}

C++ istream Input

The istream class and its extraction operator (>>) allow you to read data from various inputs like the console or files in C++. This is useful for obtaining user input or processing data from files.

#include <iostream>
int main() {
int number;
std::cout << "Enter a number: ";
std::cin >> number;
std::cout << "You entered: " << number << std::endl;
return 0;
}

C++ File Streams

C++ incorporates file streams, such as ifstream for reading files and ofstream for writing to files. These facilitate file I/O by extending stream classes. The example demonstrates how to use ifstream to read from a file and ofstream to write to a file.

#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ifstream inputFile("example.txt");
std::ofstream outputFile("output.txt");
std::string line;
// Check if file is open
if (inputFile.is_open()) {
while (getline(inputFile, line)) {
std::cout << line << std::endl; // Display line
outputFile << line << std::endl; // Write line to output file
}
inputFile.close();
outputFile.close();
} else {
std::cout << "Unable to open file";
}
return 0;
}

C++ String Streams

stringstream in C++ is a useful feature for handling input and output through in-memory strings. You can easily read and write strings without using external files. This feature is particularly handy for intermediate operations on strings before processing them further.

#include <iostream>
#include <sstream> // Needed for string streams
using namespace std;
int main() {
string data = "123 456";
stringstream ss(data); // Create a stringstream object initialized with string "data"
int first, second;
ss >> first >> second; // Extract integers from the stringstream
cout << "First number: " << first << endl;
cout << "Second number: " << second << endl;
return 0;
}

C++ Stream States

In C++, you can use stream states like good, eof, fail, and bad to identify errors during stream operations. These states help in managing data input/output flows effectively and ensuring program robustness.

#include <iostream>
#include <fstream>
int main() {
std::ifstream file("example.txt");
if (file.is_open()) {
// Check stream state
if (file.good()) std::cout << "Stream is good." << std::endl;
if (file.eof()) std::cout << "End of file reached." << std::endl;
if (file.fail()) std::cout << "Logical error on input." << std::endl;
if (file.bad()) std::cout << "Non-recoverable error." << std::endl;
file.close();
} else {
std::cerr << "Unable to open the file." << std::endl;
}
return 0;
}

C++ Stream Operators

In C++, you can overload custom stream operators to handle user-defined types for both input and output, enhancing the flexibility of your code. Here’s how to overload the << and >> operators for a custom Point class.

#include <iostream>
class Point {
public:
int x, y;
// Friend functions for stream operators
friend std::ostream& operator<<(std::ostream& os, const Point& p);
friend std::istream& operator>>(std::istream& is, Point& p);
};
// Overload operator<< to output Point
std::ostream& operator<<(std::ostream& os, const Point& p) {
return os << "(" << p.x << ", " << p.y << ")";
}
// Overload operator>> to input Point
std::istream& operator>>(std::istream& is, Point& p) {
return is >> p.x >> p.y;
}
int main() {
Point pt;
std::cout << "Enter coordinates (x y): ";
std::cin >> pt;
std::cout << "You entered: " << pt << std::endl;
return 0;
}

Learn more on Codecademy

  • Learn advanced C++ programming with preprocessor directives, operator overloading, streams, and lambda expressions.
    • With Certificate
    • Advanced.
      9 hours