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

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

Linda Hamilton
Linda Hamilton원래의
2024-11-06 15:23:02510검색

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&amp; 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&amp; 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;
}

이 예에서 출력 스트림은 값과 함께 숫자 10, 11, 10, 11을 인쇄합니다. 처음 두 숫자에 각각 1을 더해 11, 12, 10, 11이 됩니다.

위 내용은 C의 후속 출력에 영향을 미치는 사용자 정의 스트림 조작기를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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