C에서 특정 iomanip 조작기는 '고착'이라는 동작을 나타내며, 이 동작은 스트림에 계속 영향을 미칩니다. 명시적으로 재설정됩니다. 이 동작은 다음 코드 조각에서 볼 수 있듯이 예상치 못한 결과를 초래할 수 있습니다.
std::stringstream ss; ss.fill('0'); ss.setf(ios::right, ios::adjustfield); ss << setw(2) << timestruct.tm_mday; ss << timestruct.tm_hour; ss << timestruct.tm_min; std::string filingTime = ss.str(); // BAD: '0794'
이 예에서는 setw() 조작자가 tm_mday 필드의 형식을 너비 2로 지정하고 오른쪽 맞춤을 기대합니다. 출력. 그러나 tm_hour 및 tm_min은 서식 없이 인쇄됩니다. 이는 setw()가 '고정' 조작자가 아니기 때문입니다. 즉, 다음 삽입 작업에만 영향을 미칩니다.
댓글의 토론을 바탕으로 다음은 다음과 같습니다. 조작자는 다음과 같이 분류됩니다. 'sticky':
이 조작자는 모두 객체를 반환합니다. 스트림에 삽입될 다음 개체에 대해서만 작업을 수행함을 나타냅니다.
이것들 조작자는 후속 작업의 상태에 영향을 주지 않고 스트림 자체에 대한 작업을 수행합니다.
특히, setw()는 스트림에서 다르게 동작하는 것으로 보이는 유일한 조작자입니다. 작가 시스템. '고정' 조작자는 아니지만 다음 코드에 설명된 것처럼 사용자 정의 형식 개체를 사용하는 조작자처럼 작동하도록 만들 수 있습니다.
#include <iostream> #include <iomanip> struct SquareBracktAroundNextItem { SquareBracktAroundNextItem(std::ostream& str) : m_str(str) {} std::ostream& m_str; }; struct PutSquareBracket {}; SquareBracktAroundNextItem operator<<(std::ostream& str, PutSquareBracket const& data) { return SquareBracktAroundNextItem(str); } template<typename T> std::ostream& operator<<(SquareBracktAroundNextItem const& bracket, T const& data) { std::ios_base::fmtflags flags = bracket.m_str.flags(); std::streamsize currentPrecision = bracket.m_str.precision(); bracket.m_str << '[' << std::fixed << std::setprecision(10) << data << std::setprecision(currentPrecision) << ']'; bracket.m_str.flags(flags); return bracket.m_str; } int main() { std::cout << 5.34 << "\n" // Before << PutSquareBracket() << 5.34 << "\n" // Temp change settings. << 5.34 << "\n"; // After }
출력:
5.34 [5.3400000000] 5.34
요약하면 C의 대부분의 iomanip 조작자는 '고정'입니다. 즉, 명시적으로 재설정될 때까지 스트림에 계속 영향을 미칩니다. setw()는 눈에 띄는 예외이지만 사용자 정의 형식 개체를 사용하여 '고정'되도록 만들 수 있습니다.
위 내용은 일부 C Imanipulator가 '끈적거리는' 동작을 보이는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!