命名空间
变体
操作

std::ws

来自 cppreference.com
< cpp‎ | io‎ | manip
 
 
 
输入/输出操纵器
浮点格式
整数格式
布尔格式
字段宽度和填充控制
其他格式
空格处理
ws
输出刷新
(C++20)  

状态标志操作
时间和货币 I/O
(C++11)
(C++11)
(C++11)
(C++11)
带引号的操纵器
(C++14)
 
在头文件中定义 <istream>
template< class CharT, class Traits >
std::basic_istream<CharT, Traits>& ws( std::basic_istream<CharT, Traits>& is );

从输入流中丢弃前导空格。

表现得像一个 UnformattedInputFunction,除了 is.gcount() 不被修改。在构造并检查哨兵对象后,从流中提取字符并将其丢弃,直到出现以下任何一种情况:

  • 输入序列中出现文件结束条件(在这种情况下,该函数将调用 setstate(eofbit) 但不会设置 failbit;这并不适用于 eofbit 已经在 is 上设置,然后调用 ws,在这种情况下,哨兵对象的构造将设置 failbit)。
  • 输入序列中的下一个可用字符 c 不是空格,由 std::isspace(c, is.getloc()) 确定。非空格字符不会被提取。

这是一个只读的 I/O 操纵器,它可以与表达式一起使用,例如 in >> std::ws,用于任何类型为 std::basic_istreamin

内容

[编辑] 参数

is - 对输入流的引用

[编辑] 返回值

is(连续提取空格后对流的引用)。

[编辑] 注释

如果在调用之前在流上设置了 eofbit,则哨兵对象的构造将设置 failbit

[编辑] 示例

#include <iomanip>
#include <iostream>
#include <istream>
#include <sstream>
#include <string>
 
int main()
{
    for (const char* str : {"     #1 test", "\t #2 test", "#3 test"})
    {
        std::string line;
        std::getline(std::istringstream{str}, line);
        std::cout << "getline returns:\t" << std::quoted(line) << '\n';
 
        std::istringstream iss{str};
        std::getline(iss >> std::ws, line);
        std::cout << "ws + getline returns:\t" << std::quoted(line) << '\n';
    }
}

输出

getline returns:	"     #1 test"
ws + getline returns:	"#1 test"
getline returns:	"	 #2 test"
ws + getline returns:	"#2 test"
getline returns:	"#3 test"
ws + getline returns:	"#3 test"

[编辑] 缺陷报告

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

DR 应用于 发布的行为 正确的行为
LWG 415 C++98 调用 std::ws 可能不会构造哨兵对象(与其他输入函数不一致)
要求构造哨兵对象
要求构造哨兵对象
要求构造哨兵对象

[编辑] 另请参阅

提取并丢弃字符,直到找到给定字符
(std::basic_istream<CharT,Traits> 的公共成员函数) [编辑]