使用getline在for循环中从流中安全读取数据

我想在for循环中使用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 ? 如何处理这三种情况? 我需要以其他方式进行检查吗?

谢谢AFG


如果你想通过异常捕获错误,你需要使用ios :: exception来设置它。 否则不会抛出异常。 你可以在这里查看文档:http://www.cplusplus.com/reference/iostream/ios/exceptions/。

您还可以显式调用ios :: fail(),ios :: bad()或ios :: eof()。 Docs here:http://www.cplusplus.com/reference/iostream/ios/


默认情况下,iostream在发生错误时不会抛出异常。 如果你想启用它们:

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

如果设置了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
}
链接地址: http://www.djcxy.com/p/61301.html

上一篇: safe reading from a stream in a for loop using getline

下一篇: Integrate an IM chat server to existing Spring server