Почему 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<< для другого типа может решить иначе и продолжать даже в помещениях.