>백엔드 개발 >C++ >일부 C Imanipulator가 '끈적거리는' 동작을 보이는 이유는 무엇입니까?

일부 C Imanipulator가 '끈적거리는' 동작을 보이는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-25 19:32:10743검색

Why Do Some C   Iomanipulators Exhibit

C의 조작기와 '고착' 특성

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':

  • setiosflags
  • resetiosflags
  • setbase
  • setfill
  • setprecision

이 조작자는 모두 객체를 반환합니다. 스트림에 삽입될 다음 개체에 대해서만 작업을 수행함을 나타냅니다.

Non-Sticky 조작자

  • [no]boolalpha
  • [no]showbase
  • [n o]showpoint
  • [no]showpos
  • [no]skipws
  • [no]unitbuf
  • [no]대문자
  • dec/hex/oct
  • 고정/과학
  • 내부/왼쪽/오른쪽
  • ws/endl /종료/플러시

이것들 조작자는 후속 작업의 상태에 영향을 주지 않고 스트림 자체에 대한 작업을 수행합니다.

예외: setw()

특히, 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.