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::string
e fread()
nella std::string
's const_cast<char*>()
' ed data()
. Ciò richiede che std::string
i 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::string
dimensione 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::ostringstream
e 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
è.