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

Comment optimiser la lecture de fichiers binaires dans un vecteur de caractères non signés ?

Linda Hamilton
Libérer: 2024-11-02 03:37:02
original
247 Les gens l'ont consulté

How to Optimize Reading Binary Files into a Vector of Unsigned Chars?

Optimisation de la lecture des fichiers binaires

Pour lire de manière optimale les fichiers binaires dans un vecteur de caractères non signés, envisagez les stratégies suivantes :

Méthode 1 : Construction de vecteur personnalisé

<code class="cpp">std::vector<BYTE> readFile(const char* filename)
{
    std::ifstream file(filename, std::ios::binary);
    std::streampos fileSize = file.tellg();
    file.seekg(0, std::ios::beg);
    std::vector<BYTE> fileData(fileSize);
    file.read((char*) &fileData[0], fileSize);
    return fileData;
}</code>
Copier après la connexion

Cette méthode crée explicitement un vecteur avec la taille correcte en fonction de la taille du fichier. Cependant, il convertit les données du vecteur en char*, ce qui n'est pas souhaitable.

Méthode 2 : Istreambuf Iterator

<code class="cpp">std::vector<BYTE> readFile(const char* filename)
{
    std::ifstream file(filename, std::ios::binary);
    return std::vector<BYTE>((std::istreambuf_iterator<char>(file)),
                              std::istreambuf_iterator<char>());
}</code>
Copier après la connexion

Cette méthode utilise un itérateur qui lit les données dans un tampon de caractères en interne. Bien qu'elle soit plus courte, elle nécessite toujours des itérateurs de caractères malgré la lecture de caractères non signés.

Méthode 3 : spécialisation Ifstream de base

<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>
Copier après la connexion

Cette méthode utilise un flux de fichier d'entrée spécialisé pour les caractères non signés. Cependant, cela peut ne pas être approprié dans tous les cas.

Optimisations

  • Capacité de réserve : La pré-allocation de mémoire pour le vecteur améliore les performances.
  • Désactiver la suppression des nouvelles lignes : ios::skipws en mode binaire peut entraîner des problèmes de performances ; désactivez-le avec unsetf.
  • istream_iterator vs. std::copy: std::copy peut éviter la surcharge associée à l'opérateur >>.

Considérations

  • Les itérateurs Istreambuf peuvent être préférés pour leur simplicité, mais les itérateurs personnalisés peuvent offrir de meilleures performances.
  • La « meilleure » méthode dépend des exigences spécifiques du l'application et les données en cours de lecture.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal