Nombre de fichiers où appartient un terme

Résolu/Fermé
thebestgirl Messages postés 9 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 4 octobre 2010 - 28 juil. 2010 à 21:47
overcode Messages postés 119 Date d'inscription jeudi 6 décembre 2007 Statut Membre Dernière intervention 21 octobre 2011 - 6 oct. 2010 à 04:04
Bonjour,
j'ai un dossier de fichiers textes et je voulais les parcourir mot à mot pour savoir le nombre de fichiers où appartient chaque terme.
le résultat de ce code est erroné, la faute est dans la fonction nbfiles, j'ai pas su le calculer,
svp aidez moi, pleaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaase.

#include <dirent.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <map>
using std::string;
using std::ifstream;


bool isValid(const std::string& path)
{
  return !path.empty() && path != "." && path != "..";
}

void fillMap(std::map<std::string, int>& map, const std::string& filename)
{  std::ifstream entree(filename.c_str());
  std::string s;
  while (entree >> s)
	++map[s];
}
  bool exists(const std::string& filename, const std::string& pattern)
{
  std::ifstream entree(filename.c_str());
  std::string s;
	while (entree >> s)

	if (s == pattern)
	  return true;

  return false;
}
void nbfiles(const std::string& filename)
{  std::map<std::string, int> map;
  fillMap(map, filename);
  int nbFile = 0;
  int som = 0;
  typedef std::map<std::string, int>::const_iterator iter;
  for (iter it = map.begin(); it != map.end(); ++it)
	if (exists(filename, it->first))
	  {++nbFile;
	   break;
	   }
   for (iter it = map.begin(); it != map.end(); ++it)
  std::cout << "Le nombre de fichier contenant le terme " << it->first << " est " << nbFile << std::endl<< std::endl;

  }
int main()
{
  static const std::string folder = "in";
   string s;
  DIR* rep = opendir(folder.c_str());
  if (rep)
  {
	struct dirent* lecture;
	int nbFile = 0;
	int totalFile = 0;

	while ((lecture = readdir(rep)))
	{
	  if (!isValid(lecture->d_name))
	continue;

	 nbfiles(folder + "/" + lecture->d_name);
	  std::cout << std::endl;
		++totalFile;
	  }
	closedir(rep);
	std::cout << "Le nombre de fichiers est : " << totalFile << std::endl;
  }
  system ("pause");
  return 0;
}
A voir également:

4 réponses

overcode Messages postés 119 Date d'inscription jeudi 6 décembre 2007 Statut Membre Dernière intervention 21 octobre 2011 27
2 oct. 2010 à 06:33
Bonsoir,

On ne comprend pas clairement la finalité de ton programme. Le terme à chercher dans les fichiers texte, quel est-il ????
0
thebestgirl Messages postés 9 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 4 octobre 2010
2 oct. 2010 à 10:36
bonjour, et merci pour ta réponse;
en fait j'ai voulu chercher pour chaque terme existant dans le dossier (dans tous les fichiers du dossier) le nombre de fichier qui comporte ce terme, voila la solution :
#include <dirent.h>
#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include <map>
#include <set>
#include <math.h>


bool isValid(const std::string& path)
{
  return !path.empty() && path != "." && path != "..";
}

void fillSet(std::multiset<std::string>& liste, const std::string& filename)
{
  std::ifstream entree(filename.c_str());
  if (!entree)
  {
	std::cerr << "Unable to read the file" << std::endl;
	return;
  }

  std::string s;
  std::set<std::string> toAdd;
  while (entree >> s)
	toAdd.insert(s);
  liste.insert(toAdd.begin(), toAdd.end());

}
 void fillMap(std::map<std::string, int>& map, const std::string& filename)
{
  std::ifstream entree(filename.c_str());
  std::string s;
  while (entree >> s)
	++map[s];

}

 void nbFiles( const std::string& filename)
{std::multiset<std::string>::const_iterator iter;

   std::multiset<std::string> liste;

   static const std::string folder = "in";
   DIR* rep1 = opendir(folder.c_str());

  
  std::map<std::string, int> map;
  fillMap(map, filename);
  int nbfic = 0;
  typedef std::map<std::string, int>::const_iterator iter3;

  std::cout << "\t fichier " << filename << std::endl;
  std::cout<<std::endl;
  for (iter3 it = map.begin(); it != map.end(); ++it)
	{
	   if (rep1)
	   {  struct dirent* lecture1;

		while ((lecture1 = readdir(rep1)))
		 {
			if (!isValid(lecture1->d_name))
			continue;
			std::string filename = lecture1->d_name;
			fillSet (liste, folder + "/" + filename);
		 }


		  for (iter=liste.begin(); iter!=liste.end(); iter++)
		  {

			 if (it->first == *iter)
			 nbfic++;

		  }
		}
		closedir(rep1);
		std::cout << "* nombre de fichiers ou appartient le terme " << it->first << " est " << nbfic << std::endl;
	   nbfic=0;
 }}
	int main()
{  static const std::string folder = "abc";
   DIR* rep = opendir(folder.c_str());
  if (rep)
  {  struct dirent* lecture;

  while ((lecture = readdir(rep)))
	{
	  if (!isValid(lecture->d_name))
	continue;

		nbFiles (folder + "/" + lecture->d_name);
	 }
	closedir(rep);

  }
 system("pause");
return (0);
}
0
overcode Messages postés 119 Date d'inscription jeudi 6 décembre 2007 Statut Membre Dernière intervention 21 octobre 2011 27
4 oct. 2010 à 03:07
Ok alors :)

Tu excuseras ma curiosité, mais ... pourquoi un tel programme ?
0
thebestgirl Messages postés 9 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 4 octobre 2010
4 oct. 2010 à 10:38
d'accord, avec plaisir,
le code ci-dessus est une partie d'un programme qui calcule tf.idf : voir
http://fr.wikipedia.org/wiki/TF-IDF
c'est pour calculer le terme dj de la formule de tf.idf
0
overcode Messages postés 119 Date d'inscription jeudi 6 décembre 2007 Statut Membre Dernière intervention 21 octobre 2011 27
6 oct. 2010 à 04:04
très intéressant, je te remercie beaucoup :)
0