Rumah >pembangunan bahagian belakang >C++ >Bolehkah Penampan Strim Tersuai Digunakan untuk Membaca Data daripada Memori Malar seolah-olah Ia Menstrim daripada Fail?

Bolehkah Penampan Strim Tersuai Digunakan untuk Membaca Data daripada Memori Malar seolah-olah Ia Menstrim daripada Fail?

Linda Hamilton
Linda Hamiltonasal
2024-11-11 03:49:03879semak imbas

Can a Custom Stream Buffer Be Used to Read Data from Constant Memory as if It Were Streaming from a File?

Strim Input daripada Memori Malar

Masalah

Memandangkan penunjuk char* berterusan kepada rentetan ASCII, bolehkah anda mencipta penyelesaian untuk membaca data seolah-olah ia mengalir dari fail? Keperluan penting ialah data harus kekal tidak diubah suai.

Penyelesaian: Penampan Strim Tersuai

Penyelesaian terletak pada mencipta penimbal strim tersuai. Berikut ialah pelaksanaan tersuai:

#include <streambuf>
#include <istream>

struct membuf: std::streambuf {
    membuf(char const* base, size_t size) {
        char* p(const_cast<char*>(base));  // Casting for interface compatibility
        this->setg(p, p, p + size);
    }
};

struct imemstream: virtual membuf, std::istream {
    imemstream(char const* base, size_t size)
        : membuf(base, size)
        , std::istream(static_cast<std::streambuf*>(this)) {}
};

Penggunaan

Dengan penimbal tersuai ini, anda boleh mencipta aliran input yang dililitkan pada data malar anda:

// data points to a string "42 3.14 blah"
imemstream in(data, data_size);
int x;
float y;
std::string w;
in >> x >> y >> w;

Pendekatan ini membolehkan anda untuk membaca daripada memori tetap tanpa mengubah data asal, tidak seperti aliran rentetan yang memerlukan penyalinan.

Atas ialah kandungan terperinci Bolehkah Penampan Strim Tersuai Digunakan untuk Membaca Data daripada Memori Malar seolah-olah Ia Menstrim daripada Fail?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn