безопасное чтение из потока в для цикла с помощью getline

Я хочу читать из потокового использования std::getline в для цикла.

Поток, который я имею в виду, является классом, наследованным от 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;
      }
  }

Я хочу также проверить по другим состояниям ошибки как

eofbit failbit badbit

Но я - бит, перепутанный этим.

Если некоторые настройки условий, эти 3 флага встречены, являются каким-либо исключением, выданным как std::ios_base::failure? Как к handlse эти 3 случая? Я должен сделать проверки другие пути?

Спасибо AFG

5
задан Aᴍɪʀ 29 December 2015 в 22:49
поделиться

2 ответа

Если вы хотите фиксировать ошибки с помощью исключений, вам необходимо установить это с помощью ios :: exception. В противном случае исключение не будет создано. Вы можете ознакомиться с документацией здесь: http://www.cplusplus.com/reference/iostream/ios/exceptions/ .

Вы также можете явно вызвать ios :: fail (), ios :: bad () или ios :: eof (). Документы здесь: http://www.cplusplus.com/reference/iostream/ios/

2
ответ дан 14 December 2019 в 04:36
поделиться

По умолчанию iostreams не генерируют исключения при возникновении ошибок. Если вы хотите включить их:

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

включит исключения, если установлен неверный бит.

Чтобы включить их все:

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

Выбрасываемые исключения имеют тип:

std::ios_base::failure

, который является производным от std :: exception .

В целом, проще не использовать выполнение, а использовать такие конструкции, как:

while( std::getline( myStreamObj, line ) ) {
   // process line
}
6
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: