Je dois lire un fichier entier en mémoire et le placer dans un std::string
en C++.
Si je devais le lire dans un char[]
, la réponse serait très simple:
std::ifstream t;
int length;
t.open("file.txt"); // ouvrir le fichier d'entrée
t.seekg(0, std::ios::end); // aller à la fin
length = t.tellg(); // indiquer l'emplacement (c'est la longueur)
t.seekg(0, std::ios::beg); // revenir au début
buffer = new char[length]; // allouer de la mémoire pour un tampon de la dimension appropriée
t.read(buffer, length); // lire le fichier entier dans le tampon
t.close(); // fermer la poignée du fichier
// ... Faire des trucs avec le tampon ici ...
Maintenant, je veux faire exactement la même chose, mais en utilisant un std::string
au lieu d'un char[]
. Je veux éviter les boucles, c'est-à-dire que je ne veux pas:
std::ifstream t;
t.open("file.txt");
std::string buffer;
std::string line;
while(t){
std::getline(t, line);
// ... Ajoutez la ligne au tampon et continuez
}
t.close()
Des idées?
2 votes
Il y aura toujours une boucle impliquée, mais elle peut être implicite en tant que partie de la bibliothèque standard. Est-ce acceptable? Pourquoi essayez-vous d'éviter les boucles?
7 votes
Je crois que l'auteur savait que lire des octets impliquait une boucle. Il voulait simplement un équivalent facile, de style perl gulp. Cela incluait écrire un peu de code.
0 votes
Ce code est bogué, dans le cas où la std::string n'utilise pas un tampon continu pour ses données de chaîne (ce qui est autorisé) : stackoverflow.com/a/1043318/1602642
2 votes
@ChrisDesjardins : (1) Votre lien est obsolète (C++11 le rendu contigu) et (2) même s'il ne l'était pas,
std::getline(istream&, std::string&)
ferait toujours la bonne chose.7 votes
Information latérale pour quiconque regarde ce code: Le code présenté comme exemple pour la lecture dans char[] ne termine pas les valeurs par un caractère nul (read ne le fait pas automatiquement), ce qui peut ne pas correspondre à vos attentes.
0 votes
"la réponse serait très simple". Compréhensible oui, simple non ;-)
0 votes
Caster la
streampos
retournée partellg()
en unint
ne garantit pas de retourner la longueur du fichier. Si vous soustrayez lestreampos
au début du fichier de celui à la fin du fichier, vous obtiendrez unstreamoff
qui est garanti d'être de type entier et représenter un décalage dans le fichier, du moins en C++11. Voir cplusplus.com/reference/ios/streamoff et le commentaire dans stackoverflow.com/a/10135341/1908650. Voir stackoverflow.com/a/2409527/1908650 pour une version sécurisée.0 votes
Pourquoi cette question est-elle fermée aux réponses alors qu'elle est super dépassée et nécessite de nouvelles réponses ? De plus, elle a plus de 650 votes positifs.. au-delà de ma compréhension
0 votes
@AdanVivero C'est fermé en tant que doublon. Les nouvelles réponses doivent être postées sur la question liée.