std::strstream::strstream(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– std::strstream::strstream(3) β€” C++ Standard Libary bestie briefing πŸ’–

okay so this is the std::strstream::strstream(3) page from the C++ Standard Libary, and we are getting into constructor lore. It’s giving β€œold-school C++ stream energy,” and yes, bestie, the deprecation/removal notes are absolutely part of the story. πŸ’…

🌸 NAME 🌸

std::strstream::strstream β€” std::strstream::strstream

✨ Synopsis ✨

Two constructor overloads, both with big deprecated in C++98 / removed in C++26 energy.

strstream();

Overload (1): deprecated in C++98, removed in C++26.

strstream( char* s, int n, std::ios_base::openmode mode =
                               std::ios_base::in |
                               std::ios_base::out );

Overload (2): also deprecated in C++98 and removed in C++26.

This constructs a new input/output strstream and its underlying std::strstreambuf. 🫢

  1. Default-constructs the underlying std::strstreambuf, which creates a dynamically growing buffer, and initializes the base class with the address of the strstreambuf member.
  2. Initializes the base class with the address of the underlying std::strstreambuf member, which is initialized in one of the two possible ways below, and both of them use a user-provided fixed-size array:
    • a) if (mode & app) == 0 (the app bit is not set in mode), constructs the buffer by calling strstreambuf(s, n, s). The behavior is undefined if there are less than n elements in the array whose first element is pointed to by s.
    • b) if (mode & app) != 0 (the app bit is set in mode), constructs the buffer by calling strstreambuf(s, n, s + std::strlen(s)). The behavior is undefined if there are less than n elements in the array whose first element is pointed to by s or if the array does not contain a valid null-terminated character sequence.

πŸŽ€ Parameters πŸŽ€

  • s β€” char array to use as the output buffer.
  • n β€” size of the array to be used for output.
  • mode β€” specifies stream open mode. It is a bitmask type, and the following constants are defined (although only app is used):
    • app β€” seek to the end of stream before each write.
    • binary β€” open in binary mode.
    • in β€” open for reading.
    • out β€” open for writing.
    • trunc β€” discard the contents of the stream when opening.
    • ate β€” seek to the end of stream immediately after open.
    • noreplace (C++23) β€” open in exclusive mode.

πŸ’… Example πŸ’…

The page says // Run this code, so here is the whole example, bestie:

#include <iostream>
#include <string>
#include <strstream>

int main()
{
    // dynamic buffer
    std::strstream s1;
    s1 << 1 << ' ' << 3.14 << " example" << std::ends;
    std::cout << "Buffer holds: '" << s1.str() << "'\n";
    s1.freeze(false);

    int n;
    double d;
    std::string w;
    s1 >> n >> d >> w;
    std::cout << "Read back: n = " << n
              << ", d = " << d
              << ", w = '" << w << "'\n";

    // static buffer
    char arr[20] = "-1 -3.14 ";
    std::strstream s2(arr, sizeof arr, std::ios_base::app);
    s2 << "another" << std::ends;
    std::cout << "Buffer holds: '" << s2.str() << "'\n";
    s2 >> n >> d >> w;
    std::cout << "Read back: n = " << n
              << ", d = " << d
              << ", w = '" << w << "'\n";
}

🫢 Output 🫢

Buffer holds: '1 3.14 example'
Read back: n = 1, d = 3.14, w = 'example'
Buffer holds: '-1 -3.14 another'
Read back: n = -1, d = -3.14, w = 'another'

πŸŒ€ Defect reports πŸŒ€

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

  • DR LWG 115 β€” applied to C++98. Behavior as published: overload (2) only considered the case mode & app == 0 (== has higher precedence than &). Correct behavior: considers cases (mode & app) == 0 and (mode & app) != 0.

πŸ”₯ See also πŸ”₯

  • constructor β€” constructs a strstreambuf object (public member function of std::strstreambuf).
  • constructor β€” constructs an istrstream object, optionally allocating the buffer (public member function of std::istrstream).
  • constructor β€” constructs an ostrstream object, optionally allocating the buffer (public member function of std::ostrstream).

okay bestie, that’s the whole page! Source/version energy: http://cppreference.com, dated 2024.06.10, and the page is std::strstream::strstream(3). Periodt. πŸ’–βœ¨

πŸ“¦ where this page comes from