2010-02-16 6 views
5

Voglio leggere da un flusso utilizzando std::getline all'interno di un ciclo for.lettura sicura da un flusso in un ciclo for utilizzando getline

Lo stream intendo è una classe ereditata dallo std::basic_iostream.

 
std::string line;    
for(;;){ 
     try{ 
      std::getline(myStreamObj, line); 
      if(line != ""){ 
       std::cout << line << std::endl; 
      } 
     } 
     catch(std::ios_base::failure& ex){ 
      std::cout << ex.what() << std::endl; 
     } 
    } 

voglio anche per verificare contro le altre condizioni di errore, come

eofbit failbit badbit

ma sto po 'confuso su di esso.

Se alcune delle condizioni impostate su questi 3 flag sono soddisfatte, si verifica un'eccezione generata come std::ios_base::failure? Come superare questi 3 casi? Devo fare controlli su altri modi?

Grazie AFG

risposta

6

I iostreams per impostazione predefinita non generare eccezioni quando si verificano errori. Se si desidera abilitarli:

cout.execeptions(std::ios::badbit); 

abilita le eccezioni se è impostato badbit.

per consentire loro tutti:

cout.execeptions(std::ios::badbit 
        | std::ios::eofbit 
        | std::ios::failbit); 

Le eccezioni sollevate sono di tipo:

std::ios_base::failure 

che è derivato da std::exception.

In generale, comunque, è più facile non usare execptions, ma di usare costrutti quali:

while(std::getline(myStreamObj, line)) { 
    // process line 
} 
+0

Grazie per la tua risposta! Non sapevo di questa condizione quindi è utile. Posso farti un altro piccolo dettaglio. Perché le eccezioni non sono una buona scelta qui? –

+0

@Abruzzo Molte ragioni: più lente, non supportano facilmente la ripresa, è necessario scrivere più codice per gestire gli errori. E la maggior parte delle persone che leggono il tuo codice si aspetta che le eccezioni * e * non vengano utilizzate in quest'area, quindi troveranno il codice più difficile da capire. –