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
Linda Hamiltonoriginal
2024-11-02 03:37:02227parcourir

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>

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>

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>

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!

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