2011-11-08 15 views
-1

出力は "ファイルを開くことができません"という無限ループです。どうしたんだ?前もって感謝します。あなたがエラーの場合、イテレータをインクリメントしていない、単に十分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

クリアは通常、ファイルの処理を続けるためにバッドビットの後にオープンファイルで呼び出されます。それを取り出してみてください。それがここで何をしているのかは分かりません。ありがとう。 –

答えて

2

(p.sは、私はそれがファイルを開いて、ベクターから次のファイル名を取得することにより、処理を続けることができないという条件をテストしようとしています)。

+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 (;;)ループを使用し、イテレータの増分が3番目の句で起きているので、continueはそれをバイパスしません。

+0

ありがとうございます。それは今働いている – ihm

関連する問題