Почему std::noskipws не работает, или что он должен делать?
во-первых, насколько я понимаю, это
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 ответов
std:: noskipws говорит istream не пропускать ни одного ведущего пробела при попытке прочитать тип. Когда нет ведущего белого пространства, флаг не имеет никакого влияния.
std::skipws
работает следующим образом: std::istream
всегда сохраняет текущую позицию чтения. Если std::skipws
установлен до operator>>
называется текущая позиция чтения выдвинута к первому символу без пробела.
поведение, которое вы видите (остановитесь на первом месте после 'i'
) причинены operator>>
на std::string
(и std::wstring
). Этот оператор не принимает std::istream
флаги во внимание. Ан operator<<
для другого типа может решить иначе и продолжать даже в помещениях.