Mi rimangio la parola: guardando meglio l'esempio postato da Shodan al link http://en.cppreference.com/w/cpp/io/...ios/exceptions la faccenda di semplifica di molto, mi ero 'spaventato' per niente, ma cosi' pare molto piu comodo.
Grazie
Mi rimangio la parola: guardando meglio l'esempio postato da Shodan al link http://en.cppreference.com/w/cpp/io/...ios/exceptions la faccenda di semplifica di molto, mi ero 'spaventato' per niente, ma cosi' pare molto piu comodo.
Grazie
Stavo provando il seguente pezzo di codice:
Col seguente file di testo (dopo l'ultima riga sono andato a capo, ho dato invio, quindi c'e' una riga vuota:codice:#include <iostream> // std::cerr #include <fstream> // std::ifstream #include <string> int main () { std::ifstream file; file.exceptions ( std::ifstream::failbit | std::ifstream::badbit); try { file.open ("test.txt"); std::string c; while (!file.eof()) { getline(file, c); std::cout<<c<<std::endl; } } catch (const std::ifstream::failure& e) { std::cout<<"\nSto gestendo l'eccezione\n"; std::cerr << e.what() ; } file.close(); return 0; }
Mi aspettavo che funzionasse tutto senza eccezioni, invece ottengo il seguente output:pippo
pluto
paperino
123456
ultima riga
Da quanto ho letto dovrebbe essere causato dal fatto che la lettura dell'ultima riga mediante il getline, trovando niente, setta sia failbit che eofbit, da qui il messaggio di errore.codice:pippo pluto paperino 123456 ultima riga Sto gestendo l'eccezione basic_ios::clear
Infatti, se tolgo l'ultima riga vuota, non ottengo messaggi di eccezioni.
E' corretto, o manca altro?
Si, l'oggetto stream in se resta in uno stato valido, però è invalido dal punto di vista delle operazioni. Ossia puoi usarlo con la garanzia di non avere problemi riguardo a comportamenti strani (crash o altro), ma ogni operazione destinata al file fallisce fin quando non si ripristina lo stato good() tramite setstate().
E' una cosa abbastanza comune se in caso di lettura si usano gli operatori di estrazione >>
This code and information is provided "as is" without warranty of any kind, either expressed
or implied, including but not limited to the implied warranties of merchantability and/or
fitness for a particular purpose.
Mi viene un dubbio leggendo quanto sopra, che neanche la documentazione mi toglie: ma se lo stream e' invalido dal punto di vista delle operazioni, non va a buon fine neanche close, oppure quello funziona sempre?
Cioe', se faccio fs.good() e questo mi restituisce false, il close(), va a buon fine comunque, oppure, dato che c'e' qualcosa che non va, ma non so cosa, devo prima fare setstate e poi close?
Grazie
La close() funziona sempre a prescindere dallo stato interno.
This code and information is provided "as is" without warranty of any kind, either expressed
or implied, including but not limited to the implied warranties of merchantability and/or
fitness for a particular purpose.
E' corretto. Infatti quando viene estratta "ultima riga" lo stream non imposta subito eofbit, dato che dal suo punto di vista potrebbe esserci dell'altro. Pertanto il controllo su eof() fallisce, la getline() cerca di leggere altro, ma non essendoci altro viene impostato eofbit e conseguente eccezione.
L'unico modo corretto leggere tutto il file e contemporaneamente di testare la fine file è:
Il .eof() ha senso solo quando si vuole rileggere il file e non si sa se è terminato o no (sempre che abbia senso farlo).codice:while (getline(file, c)) { std::cout<<c<<std::endl; }
Alla fine l'unica cosa utile è goodbit per conoscere lo stato dello stream, il resto serve a poco o nulla.
This code and information is provided "as is" without warranty of any kind, either expressed
or implied, including but not limited to the implied warranties of merchantability and/or
fitness for a particular purpose.