operator<<,>>(std::basic_string)
来自 cppreference.com
< cpp | string | basic string
定义在头文件 <string> 中 |
||
template< class CharT, class Traits, class Allocator > std::basic_ostream<CharT, Traits>& |
(1) | |
template< class CharT, class Traits, class Allocator > std::basic_istream<CharT, Traits>& |
(2) | |
1) 作为 FormattedOutputFunction 行为。在构造和检查哨兵对象后,确定输出格式填充。
然后将结果序列 seq(str 的内容加上填充)中的每个字符插入到输出流 os 中,如同通过调用 os.rdbuf()->sputn(seq, n) 一样,其中 n 是 std::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
个字符,其中N
是 is.width()(如果 is.width() > 0),否则N
是 str.max_size(), - 流 is 中出现文件结束条件,或者
- std::isspace(c, is.getloc()) 对 is 中的下一个字符 c 为 true(此空格字符保留在输入流中)。
如果没有提取任何字符,则 std::ios::failbit 会在 is 上设置,这可能会抛出 std::ios_base::failure。
最后,调用 is.width(0) 取消 std::setw 的影响(如果有)。内容 |
[编辑] 异常
1) 如果在输出期间抛出异常,则可能会抛出 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 | n 是 os.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<< 的行为不符合格式化输出函数 |
行为符合 格式化输出函数 |
[编辑] 另请参阅
(C++17) |
对字符串视图执行流输出 (函数模板) |