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

时间:2015-09-03 00:37:10

标签: c++ whitespace getline stringstream 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();

}

3 个答案:

答案 0 :(得分:3)

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

  • 格式化输入,即使用`in&gt;&gt;的常用输入运算符值,跳过前导空格并在格式填写时停止
  • 无格式输入,例如std::getline(in, value) 跳过前导空格

例如,在阅读agefullname时,您可能会喜欢这样阅读:

 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";
 }

但是,如果我使用

输入此信息
47
Dietmar Kühl

它会打印出像这样的东西

age=47 fullname=''

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

if (std::cin >> age && std::getline(std::cin >> std::ws, fullname)) {
    ...
}

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

skipwsnoskipws 粘性ws不粘,所以如果你想跳过带ws的空格,你必须在每个运算符之前使用它&gt; &GT;

另请注意, skipws noskipws 仅适用于使用运算符&gt;&gt;执行的格式化输入操作在流上。 但 ws 适用于格式化输入操作(使用运算符&gt;&gt;)和无格式输入操作(例如get,put,putback,....)

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main ()
{
    char c;
    istringstream input( "     1test      2test       " );

    input >> skipws;
    c = input.peek();
    //skipws doesn't skip whitespaces in unformatted input
    cout << "After using skipws c = " << c << endl;

    input >> ws;
    c = input.peek();
    cout << "After using ws c = " <<  c << endl;
}

输出:

After using skipws c =  
After using ws c = 1