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