begin process at 2012 05 28 23:56:01
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

créer un vecteur de termes à partir d'un dossier de fichiers texte


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

créer un vecteur de termes à partir d'un dossier de fichiers texte

lundi 2 août 2010 à 19:38:46 | créer un vecteur de termes à partir d'un dossier de fichiers texte

mervat

bonjour,
pour avoir une liste contenant les termes de tous les fichiers dans un dossier, j'ai écrit ce code.
la liste que j'ai obtenue contient les termes d'un seul fichier répétés n fois (n étant le nombre de fichier dans le dossier in) alors qu'elle doit contenir les termes de tous les fichiers.
mon code me parait juste et j'ai pas pu savoir d'où la faute.
Code C/C++ :
#include <dirent.h>
#include <string>
#include <vector>
#include <fstream>
#include <iostream>
// créer un vecteur de termes à partir d'un fichier texte
void fillVector(std::vector<std::string>& liste, const std::string& filename)
{
  std::ifstream entree(filename.c_str());
  std::string s;
  while (entree >> s)
  liste.push_back(s);
}

 int main()
 {
   std::vector<std::string>::iterator iter;
   std::vector<std::string>::iterator iter2;
   std::vector<std::string> liste;
   std::vector<std::string> liste2;
   static const std::string folder = "in";
   DIR* rep = opendir(folder.c_str());

	if (rep)
  {  struct dirent* lecture;

  while ((lecture = readdir(rep)))
	{
	  fillVector (liste, lecture->d_name);
//créer un vecteur (liste2)de termes à partir d'un dossier de fichiers texte
	  for (iter=liste.begin(); iter!=liste.end(); iter++)
		 liste2.push_back(*iter);
	 }
	closedir(rep);

   }
	 for (iter2=liste2.begin(); iter2!=liste2.end(); iter2++)
		  std::cout << *iter2 << " ";
		  std::cout<<std::endl;
  system("pause");
  return (0);
  }

Pourrais-je avoir votre aide svp?
mardi 3 août 2010 à 10:32:17 | Re : créer un vecteur de termes à partir d'un dossier de fichiers texte

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
Plusieurs erreurs:
- La première liste contient déjà ce que tu veux, inutile de remettre une copie dans un autre vecteur. Qui plus est, tu remets des doublons dedans, car la première liste n'est pas effacé. Autant ne gardé qu'une liste.
- Tu as oublié de vérifier que le fichier en cours n'était pas "." ou ".." (Sous Linux, il faut le faire sinon ça plante).
- Vérifie bien la réussite de l'ouverture de ton fichier.

Erreurs de style:
- Inutile de déclarer 2 iter. Un seul suffit, tu aurais pu le réutiliser.
- iter++ et ++iter,; ce n'est pas pareil ! iter++ veut dire: faire une copie, incrémenter, puis réassigner (équivaut à iter = iter + 1). Alors que ++iter veut dire: ne pas faire de copie et directement assigner la valeur. ++iter est donc beaucoup beaucoup plus rapide. D'une manière générale, préfère toujours ++valeur à valeur++.
- Découpe ton code en petites fonctions. Ici, je ne te l'ai pas fait, mais tu devrais avoir une fonction qui affiche le contenu d'un vecteur, et une fonction qui remplit un vecteur en fonction d'un nom de répertoire (donc sortir le milieu du code de main dans une fonction).
Le main devrait ressembler à ça:
Code C/C++ :
std::vector<std::string> liste;
getTermFromDirectory(liste, folder);
displayVector(liste);



Petite correction de ton code,
Code C/C++ :
#include <dirent.h>
#include <string>
#include <vector>
#include <fstream>
#include <iostream>

// créer un vecteur de termes à partir d'un fichier texte
void fillVector(std::vector<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;
  while (entree >> s)
    liste.push_back(s);
}

int main()
{
  typedef std::vector<std::string>::const_iterator iter;
  static const std::string folder = "in";

  std::vector<std::string> liste;
  DIR* rep = opendir(folder.c_str());

  if (rep)
  {
    struct dirent* lecture;
    while ((lecture = readdir(rep)))
    {
      std::string filename = lecture->d_name;
      if (filename != "." && filename != "..")
	fillVector (liste, folder + "/" + filename);
    }
    closedir(rep);
  }

  for (iter it = liste.begin(); it != liste.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  return (0);
}



________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio

Merci d'utiliser Réponse acceptée si un post répond à votre question
mardi 3 août 2010 à 15:04:46 | Re : créer un vecteur de termes à partir d'un dossier de fichiers texte

mervat

bonjour,
merci bien pour votre aide,
en fait, j'ai fait 2 listes car je veux éliminer les doublons au sein du même fichier, donc j'ai fait une fonction removeDoublon que j'ai appelé après avoir remplis la 1ère liste, et puis je remplis la deuxième liste sans éliminer les doublons.
(i.e si un mot existe plusieurs fois dans le meme fichier ne laisser qu'une seule occurrence mais s'il existe une fois dans plusieurs fichiers garder toutes occurrences.)
si je fais une seule liste et j'exécute removeDoublon j'aurais pas le résultat voulu.
voilà la fonction removeDoublon
Code C/C++ :
void removeDoublon(std::vector<std::string> & liste)
{
        bool bFound=false;
	std::vector<std::string> final;
	std::vector<std::string>::iterator iterListe, iterFinal;
    // Test de la validité de la liste
    if (liste.empty())
        return;
    // Init de la liste résultat
    final.push_back(*liste.begin());
    for (iterListe=liste.begin()+1; iterListe!=liste.end(); iterListe++)
    {
        // Recherche si ce n'est pas un doublon
		bFound=false;
        for (iterFinal=final.begin(); iterFinal!=final.end() && !bFound; iterFinal++)
        {
            if (0==iterListe->compare(*iterFinal))
              // C'est un doublon, on passe à la chaîne suivante
                   bFound=true;
         }
        if (!bFound)
        {
            // Ce n'est pas un doublon, on l'ajoute à la liste finale
            final.push_back(*iterListe);
        }
    }
    liste=final;
}
mardi 3 août 2010 à 15:08:49 | Re : créer un vecteur de termes à partir d'un dossier de fichiers texte

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
Pas besoin de faire un "removeDoublon". Il y a une collection qui s'appelle le std::set qui est sert à éviter les doublons. Tu te fais une fonction qui remplit un std::set à partir d'un fichier, et tu copies l'intégralité de chacun des std::set dans un std::vector.

En gros, au lieu d'avoir: "vector + removeDoublon + vector", tu auras: set + vector.

________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio

Merci d'utiliser Réponse acceptée si un post répond à votre question
mardi 3 août 2010 à 17:31:55 | Re : créer un vecteur de termes à partir d'un dossier de fichiers texte

mervat

c'est vrai que set permet d'éliminer les doublons donc pas besoin de removeDoublon, mais lorsque j'ai'appliqué ceci sur mon premier code avec quelques corrections j'ai obtenu la liste finale sans doublons ce qui est le contraire de ce que j'ai voulu.


Cette discussion est classée dans : dossier, liste, fichiers, std, termes


Répondre à ce message

Sujets en rapport avec ce message

traiter des dossiers et des fichiers [ par mervat ] bonjour, je veux faire le meme traitement pour tous les fichiers d'un dossier, mais le dossier d'entrée a lui meme des dossiers de fichiers,j'ai réuss traiter plusieurs fichiers dans un dossier [ par mervat ] bonjour, je veux faire les mêmes traitements pour chaque fichier d'un dossier, je vais donner un exemple pour que vous me comprenez plus: supposons qu Liste des fichiers ouverts dans le system [ par gouidos ] salut, je me demandais si il était possible de recupérer la liste des noms des fichiers qui sont ouverts a un moment donnée par le systeme. Je voudrai Fichier qui affiche dans la console tout les fichiers et dossier du lecteur C [ par kiitos ] Comment faire un fichier qui affiche dans la console tout les fichiers et dossier du lecteur C ? Problème création d'un makefile [ par pagoda ] Bonjour, j'ai un souci sur un projet que je dois faire au plus vite, je dois faire un makefile permettant de créer un exécutable du projet, seulement problème de lecture de fichiers [ par mervat ] bonjour, je veux afficher les noms des fichiers et sous chaque nom de fichier afficher ses lignes; ce code n'arrive pas à afficher le contenu des fic Fichiers binaires [ par lektrosonic ] Bonsoir,supponsons que j'ai un liste ou un tableau d'une structure quelquonque. (on ne connai pas la taille du tableau)Je voudrais ecrire la totalite lister les fichiers dans un dossier [ par shadow1779 ] voila j'aimerai savoir comment faire pour lister les fichiers present dans un dossier si cela est possible en C. traitement successif de fichiers [ par zizofredj ] je veux lancer successivement le traitement de plusieurs instances contenues dans un même dossier. les résultats de chaque instance va être stocké dan Comptage de fichiers + poids du dossier avec fonction FindFirst et Récursivité [ par Jaybiboo ] Bonjour à tous ceux qui prendront le temps de me lire ! Actuellement en fin de BTS Informatique et Réseau pour l'Industrie et les Services techniques


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales