2010-02-16 300 views
5

我想在for循环中使用std::getline从流中读取数据。使用getline在for循环中安全读取流

我指的流是从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的任何异常?如何处理这三种情况?我需要以其他方式进行检查吗?

感谢 AFG

回答

6

默认的输入输出流发生错误时不抛出异常。如果要启用它们:

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

如果设置了badbit,则会启用异常。

为了使它们全部:

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

抛出的异常的类型为:

std::ios_base::failure 

其从std::exception的。

虽然在一般,很容易不使用execptions,但使用同样的结构:如果你想捕捉通过你需要使用的ios ::例外设置例外错误

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

感谢您的回复!我不知道这种情况,所以它很有用。我能再问你一个小细节吗?为什么例外在这里不是一个好的选择? – 2010-02-16 12:03:08

+0

@Abruzzo很多原因 - 速度较慢,不轻易支持恢复,需要编写更多代码来处理错误。大多数人阅读你的代码会期望在这个区域使用异常*而不是*,因此他们会发现代码更难理解。 – 2010-02-16 12:06:18