Come faccio a leggere un file in un std::string, cioè, leggere l'intero file contemporaneamente?
La modalità testo o binaria deve essere specificata dal chiamante. La soluzione dovrebbe essere conforme agli standard, portatile ed efficiente. Non dovrebbe inutilmente copiare i dati della stringa e dovrebbe evitare riallocazioni della memoria durante la lettura della stringa.
Un modo per farlo sarebbe quello di stat la dimensione del file, ridimensionare std::stringe fread()nella std::string's const_cast<char*>()' ed data(). Ciò richiede che std::stringi dati siano contigui, il che non è richiesto dalla norma, ma sembra essere il caso di tutte le implementazioni conosciute. Quel che è peggio, se il file viene letto in modalità testo, la std::stringdimensione del file potrebbe non corrispondere alla dimensione del file.
Una soluzione completamente corretta, conforme agli standard e portatile potrebbe essere costruita usando std::ifstream's rdbuf()in a std::ostringstreame da li in a std::string. Tuttavia, ciò potrebbe copiare i dati della stringa e / o riallocare inutilmente la memoria.
- Tutte le implementazioni delle librerie standard pertinenti sono abbastanza intelligenti da evitare qualsiasi sovraccarico inutile?
- C'è un altro modo per farlo?
- Ho perso alcune funzioni Boost nascoste che forniscono già la funzionalità desiderata?
void slurp(std::string& data, bool is_binary)
rdbuf(quello nella risposta accettata) non è il più veloce, lo readè.