Почему 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::stringstd::wstring). Этот оператор не принимает std::istream флаги во внимание. Ан operator<< для другого типа может решить иначе и продолжать даже в помещениях.