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
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!