Maison >développement back-end >C++ >Un tampon de flux personnalisé peut-il être utilisé pour lire des données à partir d'une mémoire constante comme si elles étaient diffusées à partir d'un fichier ?

Un tampon de flux personnalisé peut-il être utilisé pour lire des données à partir d'une mémoire constante comme si elles étaient diffusées à partir d'un fichier ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-11 03:49:03882parcourir

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

Flux d'entrée de la mémoire constante

Problème

Étant donné un pointeur char* constant vers une chaîne ASCII, pouvez-vous concevoir une solution pour lire les données comme s'il s'agissait d'une diffusion à partir d'un fichier ? L'exigence cruciale est que les données ne doivent pas être modifiées.

Solution : tampon de flux personnalisé

La solution réside dans la création d'un tampon de flux personnalisé. Voici une implémentation personnalisée :

#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)) {}
};

Utilisation

Avec ce tampon personnalisé, vous pouvez créer un flux d'entrée enroulé autour de vos données constantes :

// 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;

Cette approche permet vous pouvez lire à partir de la mémoire constante sans altérer les données d'origine, contrairement aux flux de chaînes qui nécessitent une copie.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn