2015-09-03 66 views
1

保存在我的文件数据的std :: WS的角色(空格)是(空格都在开始时加入,并在最终的目的本次测试):读取数据时

加载使用下面的代码的数据有或没有“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(); 

} 
+1

空白在默认情况下,提取开始除去。如果你有'std :: ios_base :: noskipws'或正在使用无格式输入,那么'std :: ws'可能会有用。 – 0x499602D2

+0

@ 0x499602D2该标志被称为'skipws'; 'noskipws'是一个操纵器功能。 – Potatoswatter

+0

@ 0x499602D2:主要用途是没有那么多的时候'的std ::的ios_base :: skipws'被禁止,而是与格式化输入不跳过前导空白。 –

回答

1

默认情况下,该流的skipws位设置和空白的每个输入之前自动跳过。如果您使用iss >> std::noskipws取消设置,那么稍后您需要iss >> std::ws

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

+0

谢谢!这非常有帮助! –

3

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

  • 格式化输入,即,使用在`>>值,跳过前导空白和停止每当格式填充通常的输入操作符
  • 未格式化的输入,例如,std::getline(in, value)确实跳过前导空白

例如,读取时和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"; 
} 

但是,如果我进入使用

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跳过空白,尤其是换行,并进行读取输入的实际内容在那里。

+0

这看起来不像有效的输入。字段应该用已知字符(新行或制表符)分隔,然后使用“忽略”转到下一个字段。 – Potatoswatter

+0

@Patatoswatter:什么是无效输入?代码和输入原样完全按预期工作。如果它让你更舒服地假设'if()'条件被写为'if(std :: cout <<“输入你的年龄:”&& std :: cin >> age && std :: cout <<“全名:“&& std :: getine(std :: cin >> std :: ws,fullname)){...}' –

+0

我的意思是,这是一个奇怪的程序,不关心输入项是否出现在新行或不行。基本上你使用'>> ws'来确保换行符与制表符或空格相同。似乎对我怀疑。 – Potatoswatter

0

skipwsnoskipwsws不粘腻,所以如果你想跳过与WS空格,您必须在每次操作之前使用>>。

还要注意的是skipwsnoskipws仅适用于在流与运营商进行格式化输入操作>>。 但ws适用于格式化输入操作(使用操作符>>)和未格式化输入操作(例如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