Namespaces
Variants

std::strstream:: strstream

From cppreference.net
strstream ( ) ;
(1) (C++98 中已弃用)
(C++26 中移除)
(2) (C++98 中已弃用)
(C++26 中移除)

构造新的输入/输出字符串流及其底层的 std::strstreambuf

1) 默认构造底层的 std::strstreambuf ,这会创建一个动态增长的缓冲区,并使用该 strstreambuf 成员的地址初始化基类。
2) 使用底层 std::strstreambuf 成员的地址初始化基类,该成员通过以下两种可能方式之一进行初始化,两种方式均使用用户提供的固定大小数组:
a) 如果 ( mode & app ) == 0 mode 中未设置 app 位),则通过调用 strstreambuf ( s, n, s ) 构造缓冲区。如果由 s 指向首元素的数组中元素数量少于 n ,则行为未定义。
b) ( mode & app ) ! = 0 (即 mode 中设置了 app 位),则通过调用 strstreambuf ( s, n, s + std:: strlen ( s ) ) 构造缓冲区。若以 s 指向首元素的数组元素数量少于 n ,或该数组不包含有效的空终止字符序列,则行为未定义。

目录

参数

s - 用作输出缓冲区的 char 数组
n - 用于输出的数组大小
mode - 指定流打开模式。此为位掩码类型,定义了以下常量(但仅使用 app ):
常量 说明
app 每次写入前定位到流末尾
binary 二进制模式 打开
in 为读取而打开
out 为写入而打开
trunc 打开时清空流内容
ate 打开后立即定位到流末尾
noreplace (C++23) 以独占模式打开

示例

#include <iostream>
#include <string>
#include <strstream>
int main()
{
    // 动态缓冲区
    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";
    // 静态缓冲区
    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";
}

输出:

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'

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 115 C++98 重载(2)仅考虑情况
mode & app == 0 == 的优先级高于 &
考虑情况 ( mode & app ) == 0
( mode & app ) ! = 0

参见

构造 strstreambuf 对象
( std::strstreambuf 的公开成员函数)
构造 istrstream 对象,可选择性地分配缓冲区
( std::istrstream 的公开成员函数)
构造 ostrstream 对象,可选择性地分配缓冲区
( std::ostrstream 的公开成员函数)