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; }
이 예에서 출력 스트림은 값과 함께 숫자 10, 11, 10, 11을 인쇄합니다. 처음 두 숫자에 각각 1을 더해 11, 12, 10, 11이 됩니다.
위 내용은 C의 후속 출력에 영향을 미치는 사용자 정의 스트림 조작기를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!