2010-02-16 2 views
5

Я хочу читать из потока, используя std::getline внутри цикла for.безопасное чтение из потока в цикле for с использованием 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

Но я немного запутался об этом.

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

Благодаря AFG

ответ

2

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

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

6

В iostreams по умолчанию не генерируют исключения, когда происходят ошибки. Если вы хотите их включить, выполните следующие действия:

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

будет включать исключения, если установлен битбит.

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

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

Исключения выброшенные имеют тип:

std::ios_base::failure 

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

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

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

Спасибо за ваш ответ! Я не знал об этом состоянии, поэтому он пригодится. Могу я задать вам еще одну небольшую деталь. Почему исключения здесь не являются хорошим выбором? –

+0

@Abruzzo Множество причин - медленнее, нелегко поддержать возобновление, нужно написать больше кода для обработки ошибок. И большинство людей, читающих ваш код, будут ожидать исключений * not *, которые будут использоваться в этой области, поэтому они найдут код сложнее понять. – 2010-02-16 12:06:18

Смежные вопросы