Inizializzare una stringa con il contenuto di un file

Potrebbe capitare di dover manipolare il contenuto di un file come se fosse una stringa. Ebbene, qui viene indicato un metodo per farlo in 2 righe di codice, in C++. Riporto il metodo perchè, oltre che ad essere efficace, ha pure una certa eleganza.

std::ifstream ifs("filename.txt");
std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());

L’autore indica come necessarie le parentesi per un parsing corretto. Sempre traducendo dalle parole dell’autore, la prima riga dichiara un ifstream inizializzato con il nome del file che si vuole leggere. La seconda riga svolge effettivamente il lavoro. Si tratta del costruttore di std::string che prende come argomenti una coppia di iteratori di input. Il primo è un istreambuf_iterator inizializzato con lo stream dichiarato precedentemente. Il secondo è un istreambuf_iterator con il costruttore di default. Un istreambuf_iterator inizializzato con il costruttore di default equivale ad un altro istreambuf_iterator che ha esarito l’input dal quale stava leggendo. Quindi il costruttore della stringa legge il file dal primo istreambuf_iterator fino alla fine del file.

Il primo argomento deve essere racchiuso tra parentesi per evitare che il compilatore confonda la dichiarazione della stringa con la dichiarazione di una funzione. In particolare, una funzione che ritorna una std::string, chiamata str che prende come primo argomento un istreambuf_iterator<char> chiamato ifs e come secondo argomento un istreambuf_iterator<char> senza nome. Tecnicamente si può anche racchiudere il secondo argomento tra parentesi ma, di solito, si racchiude il primo.

Annunci
Inizializzare una stringa con il contenuto di un file

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...