2010-02-16 296 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