Why doesn't std::noskipws work, or what is it supposed to do?
First off my understanding is that
cin >> std::noskipws >> str;
should stick a whole line from cin
like "i have spaces" into str
. However this only puts "i" into str
. This could be a false assumption in which case what does std::noskipws
do?
I know there is a fu开发者_C百科nction std::getline
and that does work but simply for educational purposes I decided I would try to get std::noskipws
to work for me. I have tried in the past and it just never works so I normally move on and use std::getline
.
What I think I have found so far is that std::noskipws
technically just unsets std::skipws
which internally to the basic_iostream
just calls
ios_base::unsetf(std::ios::skipws);
or
ios_base::unsetf(ios_base::skipws);
So I tried inheriting my own stream form basic_iostream
and setting those flags (unsetting) them manually. Still no dice.
So, am I just totally off base or is there a way to make this work?
std::noskipws tells the istream to not skip any leading white space when attempting to read a type. When there is no leading white space, then the flag has no impact.
std::skipws
works as follows: std::istream
always keeps a current read position. If std::skipws
is set, before operator>>
is called the current read position is advanced to the first non-space character.
The behavior you're seeing (stop at the first space after 'i'
) is caused by operator>>
for std::string
(and std::wstring
). That operator doesn't take the std::istream
flags into account. An operator<<
for another type may decide otherwise and continue even across spaces.
精彩评论