CppDS.com

C++ 98 11 14 17 20 手册

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

来自cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
 
定义于头文件 <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) 。构造并检查 sentry 对象后,以如下方式确定输出格式填充:

a) 若 str.size() 不小于 os.width() ,则原样地使用范围 [str.begin(), str.end())
b) 否则,若 (os.flags() & ios_base::adjustfield) == ios_base::left ,则放置 os.width()-str.size()os.fill() 字符的副本到字符序列后
c) 否则,放置 os.width()-str.size()os.fill() 字符副本到字符序列前

然后存储每个来自结果序列( str 的内容加上填充)到输出流 os ,如同通过调用 os.rdbuf()->sputn(seq, n) ,其中 n=std::max(os.width(), str.size())

最后,调用 os.width(0) 取消 std::setw 的效果,若存在。

2) 表现为有格式输入函数 (FormattedInputFunction) 。构造并检查 sentry 对象,这可能跳过前导空白符,然后首先以 str.erase() 清除 str ,然后从 is 读取字符并后附它们到 str ,如同用 str.append(1, c) ,直至下列条件之一变为真:

  • 读取了 N 个字符,其中若 is.width() > 0Nis.width() ,否则 Nstr.max_size()
  • is 中出现文件尾条件
  • std::isspace(c,is.getloc())is 中的下个字符 c 为 true (空白符留在输入流中)。

若未释出字符,则设置 is 上的 std::ios::failbit ,这可能抛出 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 <string>
#include <sstream>
 
int main()
{
    std::string greeting = "Hello, whirled!";
    std::istringstream is(greeting);
    std::string hello_comma;
    is >> hello_comma;
    std::cout << greeting << '\n' << hello_comma << '\n';
}

输出:

Hello, whirled!
Hello,
关闭