Dans certains scénarios, la lecture d'un fichier dans un std::vector
std::ifstream testFile("testfile", "rb"); std::vector<char> fileContents; int fileSize = getFileSize(testFile); fileContents.reserve(fileSize); testFile.read(&fileContents[0], fileSize);
Cependant, cette approche échoue lors du redimensionnement du vecteur avec reserve(), car il n'insère pas réellement d'éléments dans le vecteur. Par conséquent, toute tentative d'accès à fileContents[0] provoquera une erreur.
Une solution plus complète implique l'utilisation d'itérateurs. À l'aide d'un flux de fichier d'entrée, l'extrait suivant permet une lecture efficace du fichier :
#include<iterator> //... std::ifstream testFile("testfile", std::ios::binary); std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)), std::istreambuf_iterator<char>());
Cette approche utilise istreambuf_iterator pour parcourir le flux de fichier d'entrée et insérer des éléments directement dans le vecteur.
Si les réallocations sont un problème, reserve() peut être utilisé pour pré-allouer de l'espace dans le vecteur :
#include<iterator> //... std::ifstream testFile("testfile", std::ios::binary); std::vector<char> fileContents; fileContents.reserve(fileSize); fileContents.assign(std::istreambuf_iterator<char>(testFile), std::istreambuf_iterator<char>());
Dans cette variante, reserve() est utilisé pour allouer de l'espace en fonction de la taille du fichier connue, et assign() est utilisé pour remplir le vecteur à l'aide d'itérateurs.
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!