为什么std :: noskipws没有工作,或者它应该做什么?

时间:2011-04-13 19:39:52

标签: c++ std cin

首先,我的理解是

cin >> std::noskipws >> str;

应该从cin像“我有空格”到str。但是,这只会将“i”放入str。这可能是一个错误的假设,在这种情况下std::noskipws会做什么?

我知道有一个功能std::getline,但确实有用,但仅仅出于教育目的,我决定让std::noskipws为我工作。我过去曾尝试过,但它永远不会有效,所以我通常会继续使用std::getline

我认为到目前为止我发现std::noskipws技术上只是取消设置std::skipws basic_iostream内部的ios_base::unsetf(std::ios::skipws);

ios_base::unsetf(ios_base::skipws);

basic_iostream

所以我尝试继承我自己的流表单{{1}}并手动设置这些标志(取消设置)。仍然没有骰子。

那么,我是完全偏离基础还是有办法让这项工作成功?

2 个答案:

答案 0 :(得分:13)

std :: noskipws告诉istream在尝试读取类型时不会跳过任何前导空格。如果没有前导空格,则该标志没有影响。

答案 1 :(得分:3)

std::skipws的工作原理如下:std::istream始终保持当前的读取位置。如果设置了std::skipws,则在调用operator>>之前,当前读取位置将前进到第一个非空格字符。

您所看到的行为(在'i'之后的第一个空格处停止)是由operator>> std::string(以及std::wstring)引起的。该运算符不考虑std::istream标志。另一种类型的operator<<可以另行决定,甚至跨越空格继续。