2011-11-08 6 views
-1

La sortie est une boucle infinie de "impossible d'ouvrir le fichier". Qu'ai-je fait de mal? Merci d'avance. (P.s Je suis en train de tester la condition qu'il ne peut pas ouvrir le fichier et poursuivre le traitement en obtenant le nom de fichier suivant à partir du vecteur)clear() passe en boucle infinie

#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

clear est normalement appelé sur un fichier ouvert après un badbit pour continuer le traitement du fichier. Essayez juste de le sortir? pas sûr de ce qu'il fait ici. –

Répondre

2

Assez simplement, vous n'êtes pas incrémenter l'itérateur dans votre cas d'erreur.

+0

merci. problème résolu! – ihm

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

Vous devez incrémenter votre itérateur ici.

+0

merci! travaillé. – ihm

+0

Ou on pourrait supprimer toutes les lignes suivant 'cerr'. La boucle d'entrée suivante serait simplement ignorée de toute façon. - Après tout, vous fermez un fichier que vous ne pouviez pas ouvrir et cela ne cause aucun dommage. – visitor

1
  1. iter = files.begin()
  2. commencent boucle
  3. ouverture échoue
  4. iter est pas incrémenté
  5. goto 2

Une meilleure façon d'écrire ce peut être de utilisez une boucle for (;;), avec l'incrément d'itérateur dans la troisième clause, de sorte qu'un continue ne le contourne pas.

+0

merci. ça marche maintenant – ihm