命名空间
变体
操作

operator<<,>>(std::basic_string)

来自 cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
成员函数
元素访问
迭代器
容量
修改器
搜索
操作
常量
非成员函数
I/O
operator<<operator>>
比较
(直到 C++20)(直到 C++20)(直到 C++20)(直到 C++20)(直到 C++20)(C++20)
数值转换
(C++11)(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
文字
辅助类
推导指南 (C++17)

 
定义在头文件 <string>
template< class CharT, class Traits, class Allocator >

std::basic_ostream<CharT, Traits>&
    operator<<( std::basic_ostream<CharT, Traits>& os,

                const std::basic_string<CharT, Traits, Allocator>& str );
(1)
template< class CharT, class Traits, class Allocator >

std::basic_istream<CharT, Traits>&
    operator>>( std::basic_istream<CharT, Traits>& is,

                std::basic_string<CharT, Traits, Allocator>& str );
(2)
1) 作为 FormattedOutputFunction 行为。在构造和检查哨兵对象后,确定输出格式填充

然后将结果序列 seqstr 的内容加上填充)中的每个字符插入到输出流 os 中,如同通过调用 os.rdbuf()->sputn(seq, n) 一样,其中 nstd::max(os.width(), str.size()) 最后,调用 os.width(0) 取消 std::setw 的影响(如果有)。

等效于 return os << std::basic_string_view<CharT, Traits>(str);.

(自 C++17 起)
2) 作为 FormattedInputFunction 行为。在构造和检查哨兵对象(它可能会跳过前导空格)后,首先使用 str.erase() 清除 str,然后从 is 中读取字符并将其追加到 str 中,如同通过 str.append(1, c) 一样,直到以下条件之一变为真
  • 读取了 N 个字符,其中 Nis.width()(如果 is.width() > 0),否则 Nstr.max_size()
  • is 中出现文件结束条件,或者
  • std::isspace(c, is.getloc())is 中的下一个字符 ctrue(此空格字符保留在输入流中)。

如果没有提取任何字符,则 std::ios::failbit 会在 is 上设置,这可能会抛出 std::ios_base::failure

最后,调用 is.width(0) 取消 std::setw 的影响(如果有)。

内容

[编辑] 异常

1) 如果在输出期间抛出异常,则可能会抛出 std::ios_base::failure
2) 如果没有从 is 中提取任何字符(例如,流处于文件结束位置,或者只包含空格),或者如果在输入期间抛出异常,则可能会抛出 std::ios_base::failure

[编辑] 参数

os - 一个字符输出流
is - 一个字符输入流
str - 要插入或提取的字符串

[编辑] 返回值

1) os
2) is

[编辑] 示例

#include <iostream>
#include <sstream>
#include <string>
 
int main()
{
    std::string greeting = "Hello, whirled!";
    std::istringstream iss(greeting);
 
    std::string hello_comma, whirled, word;
 
    iss >> hello_comma;
    iss >> whirled;
 
    std::cout << greeting << '\n'
              << hello_comma << '\n' << whirled << '\n';
 
    // Reset the stream
    iss.clear();
    iss.seekg(0);
 
    while (iss >> word)
        std::cout << '+' << word << '\n';
}

输出

Hello, whirled!
Hello,
whirled!
+Hello,
+whirled!

[编辑] 缺陷报告

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

DR 应用于 已发布的行为 正确行为
LWG 25 C++98 nos.width()str.size() 中较小的那个 n 是两者中较大的那个
LWG 90 C++98 std::isspace(c, getloc()) 用于检查
空格,但 getloc<string> 中未声明
getloc()
替换为 is.getloc()
LWG 91 C++98 operator>> 的行为不符合
格式化输入函数
行为符合
格式化输入函数
LWG 211 C++98 如果未提取任何字符,operator>> 不会设置 failbit 设置 failbit
LWG 435 C++98 字符由 os.rdbuf()->sputn(str.data(), n) 插入,
并且 LWG 问题 25 的解决方法使行为
os.width() 大于 str.size() 时变得不确定
确定填充
首先,插入填充后的
字符序列
LWG 586 C++98 operator<< 的行为不符合
格式化输出函数
行为符合
格式化输出函数

[编辑] 另请参阅

对字符串视图执行流输出
(函数模板) [编辑]