CodeNebula
C++98stlbeginner

std::streambuf

C++98 · The Foundation · Compiler flag: -std=c++98

Explanation

The low-level buffer abstraction underlying all stream I/O, managing character sequences.

Real-World Scenario

Redirect `std::cout` output to a file by swapping stream buffers.

Quick Snippet

snippet.cpp
std::streambuf* original = std::cout.rdbuf();
std::cout.rdbuf(fileStream.rdbuf());

Full Example

streambuf.cpp
// CodeNebula - C++98 Example: std::streambuf (rdbuf swapping)
// Compile: g++ -std=c++98 -Wall -Wextra -o example streambuf.cpp

#include <iostream>
#include <fstream>
#include <sstream>

int main() {
    const char* filename = "streambuf_test.txt";

    // Redirect cout to a file using rdbuf
    std::ofstream file(filename);
    std::streambuf* old_cout = std::cout.rdbuf(); // save original

    std::cout.rdbuf(file.rdbuf()); // redirect cout to file
    std::cout << "This goes to the file" << std::endl;
    std::cout << "So does this" << std::endl;

    std::cout.rdbuf(old_cout); // restore cout
    std::cout << "Back to console" << std::endl;
    file.close();

    // Read back the file contents
    std::ifstream in(filename);
    std::cout << "File contains:" << std::endl;
    std::cout << in.rdbuf(); // copy entire streambuf to cout
    in.close();

    // Redirect cerr to a stringstream
    std::ostringstream oss;
    std::streambuf* old_cerr = std::cerr.rdbuf();
    std::cerr.rdbuf(oss.rdbuf());

    std::cerr << "Error message captured";
    std::cerr.rdbuf(old_cerr); // restore

    std::cout << "Captured cerr: " << oss.str() << std::endl;

    std::remove(filename);
    return 0;
}

// Expected output:
// Back to console
// File contains:
// This goes to the file
// So does this
// Captured cerr: Error message captured
Run command
g++ -std=c++98 -Wall -Wextra -o example streambuf.cpp