>백엔드 개발 >C++ >C의 출력 스트림에서 향후 항목을 수정하기 위해 사용자 정의 스트림 조작기를 어떻게 사용할 수 있습니까?

C의 출력 스트림에서 향후 항목을 수정하기 위해 사용자 정의 스트림 조작기를 어떻게 사용할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-07 02:12:03208검색

How can custom stream manipulators be used to modify future items on an output stream in C  ?

C의 사용자 정의 스트림 조작기 수정

사용자 정의 조작기를 사용하여 스트림의 미래 항목을 수정하는 것은 C의 다용도 기술입니다. "hex"와 같은 조작기는 출력 형식을 변경하지만 "plusone"과 같이 값을 조정하는 조작기는 훨씬 더 큰 유연성을 제공합니다.

각 스트림에 상태를 저장하기 위해 iword 함수와 xalloc 인덱스가 사용됩니다.

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

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

Facet을 활용하여 수치 출력을 사용자 정의할 수 있습니다. my_num_put 구조체는 do_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;
}

단일 항목 수정의 경우 재설정 do_put 호출마다 0을 입력하는 것이 좋습니다.

위 내용은 C의 출력 스트림에서 향후 항목을 수정하기 위해 사용자 정의 스트림 조작기를 어떻게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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