Streamlining C++ I/O

Nurul HasanNurul Hasan
5 min read

In C++, streams are a unified way to perform input and output operations. Whether you're working with files, strings, or the console, C++ stream classes make I/O flexible and powerful.

In this article, we’ll explore:

  • String streams (ostringstream, istringstream, stringstream)

  • File streams (ofstream, ifstream, fstream)

  • Practical examples and outputs


What are Streams in C++?

Streams are abstractions for data flow. C++ provides several types:

  • cin, cout, cerr — console I/O

  • ifstream, ofstream, fstream — file I/O

  • istringstream, ostringstream, stringstream — string I/O

To use them:

#include <iostream>    // For cout, cin
#include <fstream>     // For file streams
#include <sstream>     // For string streams

1. std::ostringstream – Output to String

Use std::ostringstream when you want to build a string using stream-style output.

Example:

#include <iostream>
#include <sstream>

int main() {
    std::ostringstream oss;
    oss << "Pi is approximately " << 3.14159;

    std::string result = oss.str();  // Get the string
    std::cout << result << std::endl;
    // Output: Pi is approximately 3.14159
}

2. std::istringstream – Input from String

Use std::istringstream to parse input from a string, just like you would read from cin.

Example:

#include <iostream>
#include <sstream>

int main() {
    std::string input = "42 3.14 Hello";
    std::istringstream iss(input);

    int a;
    float b;
    std::string c;

    iss >> a >> b >> c;

    std::cout << "a: " << a << ", b: " << b << ", c: " << c << std::endl;
    // Output: a: 42, b: 3.14, c: Hello
}

3. std::stringstream – Input and Output to String

std::stringstream is a two-way stream, allowing both output and input operations.

Example:

#include <iostream>
#include <sstream>

int main() {
    std::stringstream ss;

    ss << "100 20.5 Hello";

    int a;
    float b;
    std::string c;

    ss >> a >> b >> c;

    std::cout << "a: " << a << ", b: " << b << ", c: " << c << std::endl;
    // Output: a: 100, b: 20.5, c: Hello
}

4. Tokenizing a String with stringstream

A common use case is splitting a string by whitespace.

Example:

#include <iostream>
#include <sstream>

int main() {
    std::string text = "C++ is powerful";
    std::stringstream ss(text);

    std::string word;
    while (ss >> word) {
        std::cout << "Word: " << word << std::endl;
    }
    // Output:
    // Word: C++
    // Word: is
    // Word: powerful
}

Summary of String Streams

Stream TypeDirectionTargetPurpose
ostringstreamOutputStringWrite/build string via stream
istringstreamInputStringParse input from a string
stringstreamIn/OutStringCombine output and input

File Streams in C++

File streams allow reading/writing to files.

#include <fstream>

5. std::ofstream – Writing to Files

Example:

#include <iostream>
#include <fstream>

int main() {
    std::ofstream file("example.txt");

    if (file.is_open()) {
        file << "Hello, file!\n";
        file << "This is C++ writing to a file.\n";
        file.close();
    }

    std::cout << "File written successfully.\n";
    // Output: File written successfully.
    // (Also creates example.txt with 2 lines)
}

6. std::ifstream – Reading from Files

Example:

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::ifstream file("example.txt");

    if (file.is_open()) {
        std::string line;
        while (std::getline(file, line)) {
            std::cout << line << std::endl;
        }
        file.close();
    }
    // Output (reads content from example.txt):
    // Hello, file!
    // This is C++ writing to a file.
}

7. std::fstream – Read and Write to File

Example:

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::fstream file("log.txt", std::ios::in | std::ios::out | std::ios::app);

    if (file.is_open()) {
        file << "New log entry\n";
        file.seekg(0); // Go to beginning for reading

        std::string line;
        while (std::getline(file, line)) {
            std::cout << line << std::endl;
        }

        file.close();
    }
    // Output: prints all contents of log.txt, including new entry
}

Why Use These?

  • ostringstream: To create formatted strings (like to_string)

  • istringstream: To parse user input, config files, logs

  • stringstream: Best of both worlds

  • File streams: Persistent I/O for reading/writing to disk


Custom Example: to_string_custom

You can build a to_string replacement using ostringstream:

#include <sstream>
#include <string>

template<typename T>
// a way to write generic, reusable code that works with any data type.
std::string to_string_custom(T value) {
    std::ostringstream oss;
    oss << value;
    return oss.str();
}

int main() {
    std::cout << to_string_custom(42.123) << std::endl;
    // Output: 42.123
}

Final Summary Table

Stream TypeHeaderI/OUse Case
ostringstream<sstream>OutputConvert data to string
istringstream<sstream>InputParse data from string
stringstream<sstream>In/OutFormat, then read back
ofstream<fstream>OutputWrite to files
ifstream<fstream>InputRead from files
fstream<fstream>In/OutRead/write file

Conclusion

C++ stream classes are incredibly versatile tools for handling both string and file I/O. By mastering ostringstream, istringstream, and stringstream, you gain full control over dynamic string processing — crucial for config parsing, logging, formatting, and more.

If you'd like, I can also show you:

  • Exception handling with streams

  • Formatting (e.g., padding, precision)

  • Reading structured data like CSVs


note:

I hope this article helped you better understand C++ streams and templates. Happy coding!

Thanks for reading! ❤️

0
Subscribe to my newsletter

Read articles from Nurul Hasan directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Nurul Hasan
Nurul Hasan