Maison >développement back-end >C++ >Comment lire efficacement des fichiers binaires dans un vecteur de caractères non signés ?

Comment lire efficacement des fichiers binaires dans un vecteur de caractères non signés ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-01 09:51:30646parcourir

How to Effectively Read Binary Files into a Vector of Unsigned Chars?

Lecture de fichiers binaires dans un vecteur de caractères non signés

Lorsque vous êtes chargé de lire un fichier binaire dans un vecteur de caractères non signés, plusieurs options se présentent.

Option 1 : Transformation explicite en char*

Cette approche lit les données dans un vecteur en utilisant une conversion explicite en char* :

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
    // ...
    file.read((char*) &fileData[0], fileSize);
    return fileData;
}</code>

Bien que fonctionnel, cela nécessite un casting explicite, ce qui peut être source de malaise.

Option 2 : istreambuf_iterator avec char

Utiliser std::istreambuf_iterator avec char comme argument de modèle simplifie le code :

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
    // ...
    return std::vector<BYTE>(std::istreambuf_iterator<char>(file),
                            std::istreambuf_iterator<char>());
}</code>

Cependant, il utilise toujours char dans l'itérateur, même si le vecteur contient des caractères non signés.

Option 3 : basic_ifstream avec BYTE

Cette option déclare explicitement que le flux du fichier d'entrée doit utiliser BYTE comme type, ce qui apporte une clarté d'intention :

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
    // ...
    std::basic_ifstream<BYTE> file(filename, std::ios::binary);
    return std::vector<BYTE>(std::istreambuf_iterator<BYTE>(file),
                            std::istreambuf_iterator<BYTE>());
}</code>

L'adéquation de basic_ifstream dépend du cas d'utilisation spécifique.

istreambuf_iterator : Simplicité vs Efficacité

std::istreambuf_iterator offre la simplicité mais n'est peut-être pas l'option la plus efficace pour les données binaires. Il utilise >> pour interpréter les données, introduisant potentiellement une surcharge inutile. Envisagez des approches alternatives telles que std::copy.

Considérations supplémentaires

  • Assurez-vous que le flux de fichiers est ouvert.
  • Testez les performances de différents options avec des données binaires.
  • Définissez std::ios::skipws sur false pour les fichiers binaires afin d'éviter de sauter les nouvelles lignes.

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