Comment puis-je lire un fichier dans un std::string
, c'est-à-dire lire le fichier entier à la fois?
Le mode texte ou binaire doit être spécifié par l'appelant. La solution doit être conforme aux normes, portable et efficace. Il ne doit pas copier inutilement les données de la chaîne et il doit éviter les réallocations de mémoire lors de la lecture de la chaîne.
Une façon de faire serait de statuer la taille du fichier, de redimensionner le std::string
et fread()
dans le std::string
's const_cast<char*>()
' ed data()
. Cela nécessite que les std::string
données s soient contiguës, ce qui n'est pas requis par la norme, mais cela semble être le cas pour toutes les implémentations connues. Pire encore, si le fichier est lu en mode texte, la std::string
taille du fichier peut ne pas être égale à la taille du fichier.
Des solutions entièrement correctes, conformes aux normes et portables pourraient être construites en utilisant std::ifstream
des rdbuf()
dans un std::ostringstream
et de là dans un std::string
. Cependant, cela pourrait copier les données de chaîne et / ou réallouer inutilement de la mémoire.
- Toutes les implémentations de bibliothèques standard pertinentes sont-elles suffisamment intelligentes pour éviter toute surcharge inutile?
- Y a-t-il une autre façon de le faire?
- Ai-je manqué une fonction Boost cachée qui fournit déjà la fonctionnalité souhaitée?
void slurp(std::string& data, bool is_binary)
rdbuf
(celui de la réponse acceptée) n'est pas le plus rapide read
.