Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 16 su 16

Discussione: [C++] File (binari)

  1. #11
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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.

  2. #12
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da shodan Visualizza il messaggio
    ma ogni operazione destinata al file fallisce fin quando non si ripristina lo stato good() tramite setstate().
    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

  3. #13
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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.

  4. #14
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da ing82 Visualizza il messaggio
    Tenendo sempre presente che l'utente finale sono io stesso, direi che allora posso affrontare il problema in questo modo:
    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

  5. #15
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Stavo provando il seguente pezzo di codice:

    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;
    }
    Col seguente file di testo (dopo l'ultima riga sono andato a capo, ho dato invio, quindi c'e' una riga vuota:


    pippo
    pluto
    paperino
    123456
    ultima riga

    Mi aspettavo che funzionasse tutto senza eccezioni, invece ottengo il seguente output:

    codice:
    pippo
    pluto
    paperino
    123456
    ultima riga
    
    Sto gestendo l'eccezione
    basic_ios::clear
    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.
    Infatti, se tolgo l'ultima riga vuota, non ottengo messaggi di eccezioni.

    E' corretto, o manca altro?

  6. #16
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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 è:
    codice:
        while (getline(file, c))
        {
          std::cout<<c<<std::endl;
        }
    Il .eof() ha senso solo quando si vuole rileggere il file e non si sa se è terminato o no (sempre che abbia senso farlo).
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.