Wie lese ich eine Datei in eine std::string
, dh lese die gesamte Datei auf einmal?
Der Text- oder Binärmodus sollte vom Anrufer angegeben werden. Die Lösung sollte standardkonform, tragbar und effizient sein. Es sollte nicht unnötig die Daten der Zeichenfolge kopieren und eine Neuzuweisung von Speicher beim Lesen der Zeichenfolge vermeiden.
Eine Möglichkeit, dies zu tun, besteht darin, die Dateigröße anzugeben, die Größe zu ändern std::string
und fread()
in die std::string
's const_cast<char*>()
' zu ändern data()
. Dies erfordert, dass die std::string
Daten zusammenhängend sind, was vom Standard nicht verlangt wird, aber es scheint für alle bekannten Implementierungen der Fall zu sein. Was noch schlimmer ist, wenn die Datei im Textmodus gelesen wird, entspricht die std::string
Größe der Datei möglicherweise nicht der Größe der Datei.
Eine vollständig korrekte, standardkonforme und tragbare Lösung könnte unter Verwendung von std::ifstream
's rdbuf()
in a std::ostringstream
und von dort in a konstruiert werden std::string
. Dies könnte jedoch die Zeichenfolgendaten kopieren und / oder den Speicher unnötig neu zuweisen.
- Sind alle relevanten Standardbibliotheksimplementierungen intelligent genug, um unnötigen Overhead zu vermeiden?
- Gibt es einen anderen Weg, es zu tun?
- Habe ich eine versteckte Boost-Funktion verpasst, die bereits die gewünschte Funktionalität bietet?
void slurp(std::string& data, bool is_binary)
rdbuf
(der in der akzeptierten Antwort) ist nicht der schnellste read
.