C 스트림 입출력(IO) 작업은 일반적으로 iostream 라이브러리를 사용하여 수행됩니다. . 이 라이브러리는 대부분의 IO 작업에 대한 견고한 기반을 제공하지만 비표준 형식의 데이터를 처리하기 위해 사용자 정의 입력 스트림을 구현해야 하는 시나리오가 있습니다.
사용자 정의 입력 스트림은 std::streambuf 클래스를 확장하고 읽기용 underflow(), 쓰기용 Overflow() 및 sync()와 같은 가상 메서드를 재정의하여 정의됩니다. 이러한 기능을 재정의하면 스트림이 기본 데이터 소스 또는 대상과 상호 작용하는 방식을 제어할 수 있습니다.
사용자 정의 입력 스트림을 구현하는 구체적인 예를 고려해 보겠습니다. 수직 XOR 인코딩을 사용하여 압축된 이미지를 디코딩하는 경우
<code class="cpp">class vxor_streambuf : public std::streambuf { public: // Constructor takes the original buffer and image width vxor_streambuf(std::streambuf *buffer, int width) : buffer(buffer), size(width / 2) { // Allocate memory for previous and current lines previous_line = new char[size]; memset(previous_line, 0, size); current_line = new char[size]; // Initialize streambuf member variables setg(0, 0, 0); setp(current_line, current_line + size); } // Destructor releases memory ~vxor_streambuf() { sync(); delete[] previous_line; delete[] current_line; } // Underflow() performs XOR decoding for reading std::streambuf::int_type underflow() { // Read line from original buffer streamsize read = buffer->sgetn(current_line, size); if (!read) return traits_type::eof(); // Perform vertical XOR decoding for (int i = 0; i < size; i += 1) { current_line[i] ^= previous_line[i]; previous_line[i] = current_line[i]; } // Update streambuf member variables setg(current_line, current_line, current_line + read); return traits_type::to_int_type(*gptr()); } // Overflow() performs XOR encoding for writing std::streambuf::int_type overflow(std::streambuf::int_type value) { int write = pptr() - pbase(); if (write) { // Perform vertical XOR encoding for (int i = 0; i < size; i += 1) { char tmp = current_line[i]; current_line[i] ^= previous_line[i]; previous_line[i] = tmp; } // Write line to original buffer streamsize written = buffer->sputn(current_line, write); if (written != write) return traits_type::eof(); } // Update streambuf member variables setp(current_line, current_line + size); if (!traits_type::eq_int_type(value, traits_type::eof())) sputc(value); return traits_type::not_eof(value); }; // Sync() flushes any pending data virtual int sync() { streambuf::int_type result = this->overflow(traits_type::eof()); buffer->pubsync(); return traits_type::eq_int_type(result, traits_type::eof()) ? -1 : 0; } private: streambuf *buffer; int size; char *previous_line; char *current_line; };</code>
<code class="cpp">ifstream infile("encoded_image.vxor"); vxor_istream in(infile, 288); // Create a new vxor_istream char data[144 * 128]; in.read(data, 144 * 128); // Read encoded data</code>
이러한 지침을 따르고 streambuf 조작의 복잡성을 이해함으로써 사용자 정의 스트림에 대한 사용자 정의 입력 스트림을 효과적으로 구현할 수 있습니다. 표준 IO 작업이 부족한 다양한 시나리오.
위 내용은 C에서 사용자 정의 입력 스트림을 사용하여 압축된 이미지를 디코딩하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!