Почему не работает std :: noskipws или что он должен делать? - PullRequest
9 голосов
/ 13 апреля 2011

Во-первых, я понимаю, что

cin >> std::noskipws >> str;

должен вставлять целую строку из cin как "у меня есть пробелы" в str.Однако это только помещает «я» в 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 и установить эти флаги (сбросив) их вручную.Все еще нет игры в кости.

Итак, я просто полностью покинул базу или есть способ заставить это работать?

Ответы [ 2 ]

13 голосов
/ 13 апреля 2011

std :: noskipws говорит istream не пропускать ни одного начального пробела при попытке прочитать тип.Когда нет начальных пробелов, флаг не оказывает влияния.

3 голосов
/ 14 апреля 2011

std::skipws работает следующим образом: std::istream всегда сохраняет текущую позицию чтения.Если установлено std::skipws, то перед вызовом operator>> текущая позиция чтения переводится на первый непробельный символ.

Поведение, которое вы видите (остановитесь на первом пробеле после 'i')вызывается operator>> для std::stringstd::wstring).Этот оператор не учитывает флаги std::istream.operator<< для другого типа может решить иначе и продолжить даже через пробелы.

...