首先,我的理解是
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}}并手动设置这些标志(取消设置)。仍然没有骰子。
那么,我是完全偏离基础还是有办法让这项工作成功?
答案 0 :(得分:13)
std :: noskipws告诉istream在尝试读取类型时不会跳过任何前导空格。如果没有前导空格,则该标志没有影响。
答案 1 :(得分:3)
std::skipws
的工作原理如下:std::istream
始终保持当前的读取位置。如果设置了std::skipws
,则在调用operator>>
之前,当前读取位置将前进到第一个非空格字符。
您所看到的行为(在'i'
之后的第一个空格处停止)是由operator>>
std::string
(以及std::wstring
)引起的。该运算符不考虑std::istream
标志。另一种类型的operator<<
可以另行决定,甚至跨越空格继续。