std::ws(空格)在读取数据时的作用

H. *_*ang 5 c++ whitespace stringstream getline istringstream

保存在我的文件中的数据是(在此测试的开头和结尾都添加了空格):

1 2 3

使用以下带有或不带有“std::ws”的代码加载数据不会造成任何差异。所以我对“std::ws”的作用感到困惑,因为我看到了使用它的代码。有人可以解释一下吗?谢谢!

void main ()
{
ifstream inf; 
inf.open ("test.txt"); 

double x=0, y=0, z=0;
string line;

getline(inf, line);
istringstream iss(line);
//Using "std::ws" here does NOT cause any difference
if (!(iss >> std::ws >> x >> y >> z >> std::ws))
{
    cout << "Format error in the line" << endl;
}
else
{
    cout << x << y << z << endl;
}
iss.str(std::string ());
iss.clear();

cin.get();

}
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 11

的主要用途std::ws是在格式化和未格式化输入之间切换时:

  • 格式化输入,即使用 `in >> value 的常用输入运算符,跳过前导空格并在填充格式时停止
  • 未格式化的输入,例如,std::getline(in, value)跳过前导空白

例如,在阅读 anage和 a 时,fullname您可能会像这样阅读它:

 int         age(0);
 std::string fullname;
 if (std::cin >> age && std::getline(std::cin, fullname)) { // BEWARE: this is NOT a Good Idea!
     std::cout << "age=" << age << "  fullname='" << fullname << "'\n";
 }
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用以下方法输入此信息

47
Dietmar Kühl
Run Code Online (Sandbox Code Playgroud)

它会打印这样的东西

age=47 fullname=''
Run Code Online (Sandbox Code Playgroud)

问题在于 之后的换行符47仍然存在并立即填充std::getine()请求。因此,您宁愿使用此语句来读取数据

if (std::cin >> age && std::getline(std::cin >> std::ws, fullname)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

使用std::cin >> std::ws跳过空格,特别是换行符,并继续阅读实际内容的输入。


Pot*_*ter 2

默认情况下,会设置流的skipws位,并在每次输入之前自动跳过空格。如果您使用 取消设置,则稍后iss >> std::noskipws需要。iss >> std::ws

有时也不会自动跳过空格。例如,要检测输入的结尾,您可以使用if ( ( iss >> std::ws ).eof() )