"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C++의 후속 출력에 영향을 미치는 사용자 정의 스트림 조작기를 만드는 방법은 무엇입니까?

C++의 후속 출력에 영향을 미치는 사용자 정의 스트림 조작기를 만드는 방법은 무엇입니까?

2024년 11월 14일에 게시됨
검색:180

How to Create Custom Stream Manipulators that Affect Subsequent Outputs in C  ?

C에서 후속 출력을 수정하기 위한 사용자 정의 스트림 조작기

C에서 스트림 조작기는 입력 및 출력 작업을 사용자 정의하고 향상시키기 위한 강력한 도구입니다. 일반적인 조작기 중 하나는 후속 숫자 출력의 형식을 16진수로 수정하는 std::hex입니다.

그러나 스트림에 추가 요소를 추가할 뿐만 아니라 항목의 값도 수정하는 조작기가 필요한 경우에는 어떻게 해야 합니까? 그 뒤에 오는거야? 이 문서에서는 이러한 조작기를 만드는 방법을 살펴보고 간단한 예를 통해 해당 사용 사례를 보여줍니다.

상태 저장소가 있는 사용자 지정 조작기

스트림에서 후속 항목을 수정하려면, 각 스트림과 관련된 상태 정보를 저장해야 합니다. 이는 ios_base::iword 함수와 xalloc에 ​​의해 생성된 인덱스를 사용하여 달성할 수 있습니다.

inline int geti() {
    static int i = ios_base::xalloc();
    return i;
}

이 메커니즘을 사용하면 add_one과 add_none이라는 두 가지 조작자를 정의할 수 있습니다. add_one은 저장된 상태를 1로 설정하고, add_none은 0으로 설정합니다.

ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; }
ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }

숫자 출력 사용자 정의

C의 숫자 출력은 패싯으로 처리됩니다. 숫자 출력의 동작을 수정하려면 사용자 정의 패싯을 정의하면 됩니다. 여기서는 저장된 상태 값만큼 각 숫자 값을 증가시키는 my_num_put이라는 사용자 정의 패싯을 생성합니다.

struct my_num_put : num_put<char> {
    iter_type do_put(iter_type s, ios_base& f, char_type fill, long v) const {
        return num_put<char>::do_put(s, f, fill, v   f.iword(geti()));
    }

    iter_type do_put(iter_type s, ios_base& f, char_type fill, unsigned long v) const {
        return num_put<char>::do_put(s, f, fill, v   f.iword(geti()));
    }
};

조작기 테스트

사용자 정의 조작기를 테스트하려면 출력 스트림에 새 패싯을 주입하고 조작기를 사용하여 숫자 출력을 수정할 수 있습니다.

int main() {
    // outputs: 11121011
    cout.imbue(locale(locale(), new my_num_put));
    cout << add_one << 10 << 11 << add_none << 10 << 11;
}

이 예에서 출력 스트림은 처음 두 숫자 각각에 값 1을 더한 숫자 10, 11, 10, 11을 인쇄하여 결과적으로 11, 12, 10, 11이 됩니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3