Operasi input/output (IO) strim C biasanya dilakukan menggunakan perpustakaan iostream . Walaupun perpustakaan ini menyediakan asas yang kukuh untuk kebanyakan tugas IO, terdapat senario di mana anda mungkin perlu melaksanakan strim input tersuai untuk mengendalikan data dalam format bukan standard.
Strim input tersuai ditakrifkan dengan melanjutkan kelas std::streambuf dan mengatasi kaedah mayanya, seperti underflow() untuk membaca dan overflow() dan sync() untuk menulis. Dengan mengatasi fungsi ini, anda boleh mengawal cara strim berinteraksi dengan sumber data atau destinasi asas.
Mari kita pertimbangkan contoh khusus untuk melaksanakan strim input tersuai untuk menyahkod imej yang telah dimampatkan menggunakan pengekodan XOR menegak.
<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>
Dengan mengikuti garis panduan ini dan memahami selok-belok manipulasi streambuf, anda boleh melaksanakan strim input tersuai dengan berkesan untuk pelbagai senario di mana operasi IO standard gagal.
Atas ialah kandungan terperinci Bagaimana untuk Menyahkod Imej Mampat Menggunakan Strim Input Tersuai dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!