Problème de fermeture de fichier

Signaler
Messages postés
4
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
8 avril 2004
-
Messages postés
4
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
8 avril 2004
-
Salut à tous.

Après pas mal de recherche je n'ai pas à réussi à trouver de réponse.

je suis confronter au problème suivant :

je veux effectue la recherche sur un répertoire donc je vais faire cette recherche dans une boucle (pour la clarté du code je ramène le problème à 2 fichiers et je mets toutes les données en dur)

lorsque je tente de fermer le fichier ouvert par ifstream.open(...) j'ai une erreur il ne le ferme pas par le close() et lorsque je tente dans ouvrir un deuxième après et ben forcément il ne peut pas puisque le premier n'est pas fermer...

voilà le code :

#include <stdio.h>
#include  
#include <string> 
#include <fstream> 
using namespace std;

#include  //_findfirst routines (system calls) 

class schClass 
{ 
 std::ifstream infs; 

public: 
 std::string fichier ;	     //le nom du fichier où faire la recherche
 std::string chemin ;	     //le chemin du fichier
 std::string chaine_Rech ; //la chaine à rechercher

 int rech_Chaine();	     //méthode de recherche d'une chaine dans le fichier, renvoie  le nombre d'occurences de la chaine dans le fichier
}; 

int schClass::rech_Chaine() 
{ 
 std::string tmp ;	//chaine temporaire de travail

 unsigned int i = 0 ;  
 char c ; 

 unsigned int nbtrouve = 0 ;

 //on affecte le chemin exact du fichier dans la variable tmp
 if((chemin.length()-1) == '\\') 
        tmp = chemin + fichier ; 
 else 
        tmp = chemin + "\" + fichier ; 

 //on ouvre le fichier et on test si OK
 infs.open(tmp.data()) ; 
 if(!infs) 
 { 
   std::cout << "Erreur ouverture de : <" << fichier << ">\n" ; 
   return false ; 
 }
 else
   std::cout << "ouverture OK de :	<" << fichier << ">\n" ; 

 //boucle de parcours du fichier caractère par caractère
 while((c=infs.get()) != EOF )
 { 
   if(c == chaine_Rech[i]) 
      i++; 
   else 
      i = 0; 

   if(i == chaine_Rech.length())
   {
    nbtrouve++;
    i=0;
   }
 } 

//on ferme le fichier et on test si OK
 infs.close(); 
 if(!infs) 
 { 
 std::cout << "Erreur fermeture de : <" << fichier << ">\n" ; 
        return false ; 
 } 

//on retourne le nb d'occurences de la chaine
 return nbtrouve ;
} 

int main() 
{ 
 schClass cible ;

//en dur pr test
 cible.chaine_Rech="BANQUE.PS" ;
 cible.chemin="C:\\toto\" ;
 cible.fichier="titi.ini" ;

 std::cout << "Pour le fichier " << cible.fichier << "il y a : " << cible.rech_Chaine() << "occurences.\n" ; 

 cible.fichier="tata.ini" ;

 std::cout << "Pour le fichier " << cible.fichier << "il y a : " << cible.rech_Chaine() << "occurences.\n" ; 

 return 1 ;
} 


Sauriez vus me dire ce que j'ai oublié de faire pour pouvoir fermer mon fichier ???

d'avance merci

Aller doucement n'empèche pas d'arriver ! (mais c'est plus long ...)

4 réponses

Messages postés
351
Date d'inscription
samedi 2 février 2002
Statut
Membre
Dernière intervention
6 mai 2004
2
vérifie qu'il y a pas de débordement de mémoire pendant la phase ou tu écrit dans le fichier

be linux
Messages postés
4
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
8 avril 2004

merci de me répondre lpikachu58,

mais je n'écris pas dans le fichier, je lis le fichier et je compte le nombre d'occurence de la chaine que je recherche.

donc je ne sais pas s'il y a un risque de débordement de mémoire.
Messages postés
4
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
8 avril 2004

j'ai enlevé toute la partie de recherche sur le fichier et j'ai juste laissé le open et le close et la la fermeture se fait correctement...

tu parles de debordement mémoire comment je peux vérifier ça ?

c'est mon "(c=infs.get()) != EOF )" qui est pourri ?

j'ai par exemple limité la recherche à la première chaine trouvée, et là aucun problème la fermeture est correcte !

j'ai un autre moyen que de faire le test sur le EOF pour voir la fin de mon fichier ?
Messages postés
4
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
8 avril 2004

bon ben ça y est !

j'ai rajouté, sans trop savoir ce que ça fait, un clear() avant le close et ça fonctionne

merci pour m'avoir donné cette piste ;)