Maison >développement back-end >C++ >Comment créer un flux à partir d'une mémoire tampon constante sans modifier les données ?

Comment créer un flux à partir d'une mémoire tampon constante sans modifier les données ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-09 08:15:02518parcourir

How Can You Create a Stream from a Constant Memory Buffer Without Altering the Data?

Création d'un flux d'entrée à partir d'une mémoire constante : surmonter la restriction d'altération des données

Pour résoudre le problème de la lecture de données à partir d'une mémoire tampon constante sans en le modifiant, il est nécessaire de créer un tampon de flux personnalisé. Ceci peut être réalisé en définissant une classe qui hérite du standard std::streambuf et remplace ses fonctions pertinentes.

Plus précisément, la classe membuf définie ci-dessous sert de tampon de flux :

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

Cette classe configure le tampon de flux avec le tampon de données fourni et sa taille, définissant essentiellement la plage de données à lire.

Pour créer un flux d'entrée basé sur cela buffer, nous définissons la classe imemstream, qui hérite à la fois de membuf et de std::istream:

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

Cette classe enveloppe essentiellement le tampon de flux personnalisé et fournit les fonctionnalités d'un flux d'entrée. Désormais, il est possible d'utiliser imemstream comme flux d'entrée régulier :

imemstream in(data, size);
in >> value;

En utilisant cette technique, on peut lire les données d'une mémoire tampon constante comme si elles provenaient d'un flux, résolvant ainsi efficacement le problème d'origine. tout en conservant l'immuabilité des données.

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