2011-11-08 40 views
-1

輸出是「無法打開文件」的無限循環。我做錯了什麼?提前致謝。 (P.S我想測試的條件,它無法打開文件,並通過從向量獲取下一個文件名繼續處理)clear()進入無限循環

#include <iostream> 
#include <istream> 
#include <fstream> 
#include <vector> 
#include <string> 
using namespace std; 
int main() 
{ 
ifstream input; 
vector<string> files; 
files.push_back("ifile"); 
files.push_back("ifile2"); 
vector<string>::const_iterator iter=files.begin(); 
while (iter!=files.end()) 
{ 
    string s; 
    input.open(iter->c_str()); 
    if (!input) 
    { 
     cerr<<"cannot open the file"<<endl; 
     input.close(); 
     input.clear(); 
     continue; 
    } 
    while(input>>s) 
     cout<<s<<' '<<ends; 
    input.close(); 
    input.clear(); 
    cout<<endl; 
    ++iter; 
} 
return 0; 
} 
+0

清除通常在badbit之後的打開文件上調用以繼續處理該文件。試試把它拿出來?不確定它在這裏做什麼。 –

回答

2

足夠簡單,你不增加你的錯誤情況下,迭代器。

+0

謝謝。問題解決了! – ihm

4
if (!input) 
{ 
    cerr<<"cannot open the file"<<endl; 
    input.close(); 
    input.clear(); 
    ++iter; 
    continue; 
} 

您需要在此處增加迭代器。

+0

謝謝!工作。 – ihm

+0

或者可以刪除'cerr'後面的所有行。無論如何,下面的輸入循環都會被忽略。 - 畢竟你正在關閉一個文件,你無法打開,它不會造成任何傷害。 – visitor

1
  1. ITER = files.begin()
  2. 開始循環
  3. 打開失敗
  4. ITER不遞增
  5. 轉到2

寫這可能是更好的辦法使用for (;;)循環,迭代器增量發生在第三個子句中,因此continue不會繞過它。

+0

謝謝。它現在正在工作 – ihm