C++ 使用getline从for循环中的流安全读取

C++ 使用getline从for循环中的流安全读取,c++,C++,我想在for循环中使用std::getline从流中读取数据 我指的流是从std::basic\u iostream继承的类 std::string line; for(;;){ try{ std::getline( myStreamObj, line ); if( line != "" ){ std::cout << line << std::endl;

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

我指的流是从std::basic\u 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; } } std::字符串行; 对于(;;){ 试一试{ std::getline(myStreamObj,line); 如果(行!=“”){
std::cout默认情况下,iostreams在发生错误时不会引发异常。如果要启用异常,请执行以下操作:

cout.execeptions( std::ios::badbit );
如果设置了badbit,将启用异常

要使它们都能够:

cout.execeptions( std::ios::badbit 
                   | std::ios::eofbit 
                   | std::ios::failbit );
引发的异常类型为:

std::ios_base::failure
它派生自
std::exception

但一般来说,不使用execption更容易,而是使用以下结构:

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

如果要通过异常捕获错误,则需要使用ios::exception进行设置。否则将不会引发异常。您可以在此处查看文档:


您还可以显式调用ios::fail()、ios::bad()或ios::eof().Docs here:

谢谢你的回复!我不知道这个条件,所以它很有用。我可以再问你一个小细节吗。为什么异常在这里不是一个好的选择?@Abruzzo有很多原因-速度较慢,不容易支持恢复,需要编写更多代码来处理错误。大多数阅读你代码的人都希望异常不会出现要在这个领域使用,他们会发现代码更难理解。
while( std::getline( myStreamObj, line ) ) {
   // process line
}