Maison  >  Article  >  développement back-end  >  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
Mary-Kate Olsenoriginal
2024-10-30 08:00:03446parcourir

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>

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>

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>

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!

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