std::ws

来自cppreference.com
< cpp‎ | io‎ | manip
 
 
 
输入/输出操纵符
浮点格式化
整数格式化
布尔格式化
域宽与填充控制
其他格式化
空白符处理
ws
输出冲入
状态标志操纵
时间与金钱 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() 。在构造并检查 sentry 对象后,从流提取并舍弃字符,直到出现任何下列条件之一:

  • 输入序列中出现文件尾条件(此时函数会调用 setstate(eofbit) 但不会设置 failbit;如果调用 ws 前已在 is 上设置 eofbit,那么不适用这条,此时 sentry 对象的构造会设置 failbit)。
  • 输入序列中下个可用字符 c 不是以 std::isspace(c, is.getloc()) 确定的空白字符。不会提取该非空白字符。

这是只输入的输入/输出操纵符,可用类似 in >> std::ws 的表达式对任何 std::basic_istream 类型的 in 调用。

参数

is - 到输入流的引用

返回值

is(到提取连续空白符后的流的引用)

注意

如果在调用前在流上设置了 eofbit,那么构造 sentry 对象就会设置 failbit

示例

#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 返回:\t\t" << quoted(line) << '\n';
 
        std::istringstream iss{str};
        std::getline(iss >> std::ws, line);
        std::cout << "ws + getline 返回:\t" << quoted(line) << '\n';
    }
}

输出:

getline 返回:		"     #1 test"
ws + getline 返回:	"#1 test"
getline 返回:		"	 #2 test"
ws + getline 返回:	"#2 test"
getline 返回:		"#3 test"
ws + getline 返回:	"#3 test"

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 415 C++98 调用 std::ws 不一定会构造 sentry 对象(与其他输入函数不一致) 需要构造 sentry 对象

参阅

持续提取并丢弃字符,直到找到给定字符
(std::basic_istream<CharT,Traits> 的公开成员函数)