函数
<istream> <iostream>

std::ws

用于 istream
istream& ws (istream& is);
基础模板
template <class charT, class traits>basic_istream<charT,traits>& ws (basic_istream<charT,traits>& is);
提取空白符
从输入序列的当前位置尽可能多地提取空白字符。提取将一直进行,直到找到一个非空白字符为止。这些提取的空白字符将被丢弃。

请注意,basic_istream 对象默认设置了 skipws 标志:这会在格式化提取操作(请参见 operator>>)之前执行类似的效果。

此函数执行的内部操作没有具体规范。
内部,该函数通过首先构造一个 sentry 对象(并将 noskipws 设置为 true)来访问输入序列 is。然后(如果 good),它会像调用其成员函数 sbumpcsgetc 一样,从 is 的关联流缓冲区对象中提取字符,最后销毁 sentry 对象,然后返回。

调用此函数不会改变 gcount 返回的值。

参数

的 C++ 等效文件是
从中提取空白符的输入流对象。
由于此函数是一个流操作符,因此它被设计为单独使用,不带参数,并与输入流的提取>>)操作结合使用(参见下面的示例)。

返回值

参数 is

错误通过修改 is内部状态标志来发出信号。
标志错误
eofbit函数停止提取字符,因为输入序列没有更多可用字符(已到达 文件末尾)。
failbit在调用之前,is流状态不是 good(适用于 C++11 和其他构造 sentry 对象的实现)。
badbit流错误(例如,当此函数捕获由内部操作抛出的异常时)。
当设置此标志时,流的完整性可能受到影响。
单个操作可能在 is 上设置多个标志。

如果操作设置了 is内部状态标志,并且该标志已通过其成员 exceptions 进行了注册,则该函数将抛出成员类型为 failure 的异常。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// ws manipulator example
#include <iostream>     // std::cout, std::noskipws
#include <sstream>      // std::istringstream, std::ws

int main () {
  char a[10], b[10];

  std::istringstream iss ("one \n \t two");
  iss >> std::noskipws;
  iss >> a >> std::ws >> b;
  std::cout << a << ", " << b << '\n';

  return 0;
}


输出
one, two


数据竞争

修改流对象 is
并发访问同一流对象可能导致数据竞争,但标准流对象 cinwcin与 stdio 同步时除外(在这种情况下,不会发生数据竞争,尽管不保证提取的字符归属给哪个线程)。

异常安全

基本保证:如果抛出异常,对象处于有效状态。
如果 is 的最终错误状态标志不是 goodbit 并且其成员 exceptions 被设置为在该状态下抛出,则此函数将抛出成员类型为 failure 的异常。
内部操作抛出的任何异常都会被函数捕获并处理,从而设置 isbadbit 标志。如果 badbit 在对 isexceptions 的最后一次调用中被设置,则函数将重新抛出捕获到的异常。

另见