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 ?

Mary-Kate Olsen
Libérer: 2024-10-30 08:00:03
original
558 Les gens l'ont consulté

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

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

Méthodes de lecture de fichiers binaires

Pour lire efficacement un fichier binaire dans un vecteur de caractères non signés (std::vector), plusieurs méthodes sont disponibles :

Méthode 1 :

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

Cette méthode ouvre le fichier et utilise file.seekg/file.tellg pour déterminer sa taille. Il alloue ensuite un vecteur de taille appropriée et lit les données. Cependant, cela nécessite une conversion explicite en char*, ce qui peut être gênant.

Méthode 2 :

<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 std::istreambuf_iterator pour parcourir les caractères du fichier et construire le vecteur, mais cela nécessite une conversion en char même si le vecteur stocke des caractères non signés.

Méthode 3 :

<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 directement un std::basic_ifstream avec le type souhaité, BYTE, évitant le besoin de casting.

Opération en coulisses :

Lors de l'utilisation de std::istreambuf_iterator, les opérations sous-jacentes impliquent la lecture du tampon interne du fichier et la conversion des données char dans le type souhaité (BYTE dans ce cas). Cependant, en raison de ce processus de conversion, certains problèmes de performances peuvent survenir.

Optimisation des performances :

Pour optimiser les performances, pensez à :

  • En utilisant std::basic_ifstream pour la gestion directe du type.
  • Réservation de la capacité du vecteur avant la lecture pour éviter plusieurs redimensionnements.
  • Utilisation de std::copy avec des itérateurs spécialisés pour transférer efficacement les données du fichier vers le vecteur.
  • Assurer que le mode binaire du fichier est activé (std::ios::binary) et que le le saut de nouvelle ligne est désactivé (std::noskipws), car ces paramètres peuvent affecter lecture de données binaires.

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