Visualizzazione dei risultati da 1 a 10 su 16

Discussione: [C++] File (binari)

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Dalla lettura della documentazione, se non ho capito male, entrambe dovrebbero essere operazioni che non invalidano l'oggetto stream, che sta svolgendo l'operazione, ma settano i flag interni a valori che descrivono quanto successo.
    Non è esatto. Se l'operazione lettura/scrittura fallisce per qualche motivo, i flag interni passano da .good() a qualcosa che può essere eofbit(), badbit() o failbit() a seconda dei casi, ma l'intero stream è invalidato e ogni operazione successiva di lettura / scrittura fallisce.
    Stando cosi le cose, finita la scrittura, verifico che il / i flag siano 'a posto', nel caso di lettura, piu o meno idem, cioe' faccio l'operazione di lettura in una variabile temporanea, verifico i flag dello stream per avere conferma che l'operazione sia avvenuta con successo, quindi copio il valore nella variabile vera e propria.
    La variabile temporanea è solo una perdita di tempo. Se la lettura avviene con successo, i dati sono immediatamente disponibili; se c'è un fallimento non li hai proprio.
    Il controllo puoi sempre farlo alla fine, ma se vuoi farlo man mano nulla te lo vieta. A quel punto però forse converrebbe abilitare le eccezioni per lo stream ed evitare un sacco di if.
    Detto molto in breve. O va o non va: non esiste un va così così.
    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. #2
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Credo allora di aver interpretato male la seguente frase, che viene riportata identica sia per il metodo write che per il metodo read:

    "Basic guarantee: if an exception is thrown, the object is in a valid state.
    It throws an exception of member type failure if the resulting error state flag is not goodbit and member exceptions was set to throw for that state.
    Any exception thrown by an internal operation is caught and handled by the function, setting badbit. If badbit was set on the last call to exceptions, the function rethrows the caught exception."

    Io l'avevo interpretata come "se qualcosa va male, l'oggetto stream resta sempre in uno stato valido, nel senso che posso comunque sapere cosa e' successo mediante i flag interni, da interrogare mediante gli appositi metodi." (non e' una traduzione letterale, ma quanto ho interpretato io).

    Appena riesco scrivo qualche riga di codice. Grazie.

  3. #3
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da shodan Visualizza il messaggio
    La variabile temporanea è solo una perdita di tempo. Se la lettura avviene con successo, i dati sono immediatamente disponibili; se c'è un fallimento non li hai proprio.
    Il controllo puoi sempre farlo alla fine, ma se vuoi farlo man mano nulla te lo vieta.
    Io pensavo al seguente caso.

    codice:
    class ProvaFile
    {
      public:
        //metodi vari
        void save(std::ofstream& file) const
        {
          file.write(reinterpret_cast<const char*>(&mDato1), sizeof(mDato1);
          file.write(reinterpret_cast<const char*>(&mDato2), sizeof(mDato2);
          file.write(reinterpret_cast<const char*>(&mDato3), sizeof(mDato3);
        };
    
        void read(std::ifstream& file)
        {
          file.read(reinterpret_cast<const char*>(&mDato1), sizeof(mDato1);
          file.read(reinterpret_cast<const char*>(&mDato2), sizeof(mDato2);
          file.read(reinterpret_cast<const char*>(&mDato3), sizeof(mDato3);
        };
    
      private:
        
        Tipo1 mDato1;
        Tipo2 mDato2;
        Tipo3 mDato3;
    
    };
    Se la lettura fallisce dopo aver letto il primo dato, quindi mentre cerca di leggere il secondo, mi trovo l'oggetto che e' in uno stato incoerente, ecco perche' dicevo di leggere in variabili temporanee, e poi, verificato che la lettura sia andata a buon fine, copiare i dati letti nei dati membro dell'oggetto.

    Quote Originariamente inviata da shodan Visualizza il messaggio
    A quel punto però forse converrebbe abilitare le eccezioni per lo stream ed evitare un sacco di if.
    Perdona l'ignoranza, ma come si fa? Sta forse scritto nei volumi sugli stream che gia' mi avevi consigliato? Grazie.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.