Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1577 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  un dossier avec plusieurs fichiers à traiter : console cassée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

un dossier avec plusieurs fichiers à traiter : console cassée

n°1590121
toutsec
Posté le 23-07-2007 à 13:37:44  profilanswer
 

Bonjoour :)
Je suis entrain de faire un petit programme pour l'exploitation de spectres.
Alors voila, il se trouve que j'ai ~400 spectres à exploiter répartie dans pas mal de dossiers.
En ce moment, je dois rentrer le nom de chaque fichier pour que les opérations se fassent.
 
Existerait il un moyen que dans la console je rentre carrement un dossier, et que ça traite automatiquement tous les fichiers qui se trouvent à l'intérieur?
 
Merci :)


Message édité par toutsec le 24-07-2007 à 12:26:18
mood
Publicité
Posté le 23-07-2007 à 13:37:44  profilanswer
 

n°1590140
theshockwa​ve
I work at a firm named Koslow
Posté le 23-07-2007 à 13:49:28  profilanswer
 

oui [:petrus75]
 
 
... mettre les mains dans le cambouis et regarder ce que ton système te propose pour énumérer les fichiers contenus dans un dossier, par exemple

n°1590141
toutsec
Posté le 23-07-2007 à 13:52:05  profilanswer
 

Bon, je code sous linux en c++.
Le problème c'est que je ne suis pas super fort et que je ne sais pas du tout comment faire :/

n°1590178
toutsec
Posté le 23-07-2007 à 14:21:49  profilanswer
 

J'ai trouvé ça, mais bon, je n'arrive pas à l'utiliser correctement.

Code :
  1. #include <sys/types.h>
  2. #include <dirent.h>
  3. DIR *opendir(const char *name1);
  4. struct dirent *readdir(DIR *name2);
 

Je mets dans mon main()

Code :
  1. char* op;
  2. DIR* pp;
  3. opendir(op);
  4. readdir(pp);
 

Ca compil bien, mais quand je lance le programme : Erreur de segmentation (core dumped).
Je suis sûr que je ne fais pas correctement le truc. :/

 


edit :

Code :
  1. dir = opendir("/home/vince/Boulot/spectre/pp" );
  2. if( dir == NULL )
  3. perror("" );
  4. while((entry = readdir(dir)) != NULL)
  5. fprintf(stdout, "Inside /usr/bin is something called %s\n", entry->d_name);
  6. fprintf(stdout, "\n" );
  7. closedir(dir);


Ca marche :)


Message édité par toutsec le 23-07-2007 à 14:35:02
n°1590198
KangOl
Profil : pointeur
Posté le 23-07-2007 à 14:35:35  profilanswer
 

boost::filesystem

n°1590200
theshockwa​ve
I work at a firm named Koslow
Posté le 23-07-2007 à 14:37:42  profilanswer
 

Code :
  1. string nomDossier = "/home/moi/plop";
  2. DIR* dossier = opendir(nomDossier.c_str());
  3. dirent contenuDossier = readdir(dossier);


devrait mieux fonctionner (au feeling, je ne crois pas avoir jamais utilisé ces fonctions)
attention à bien lire la doc pour la libération des ressources !

n°1590201
theshockwa​ve
I work at a firm named Koslow
Posté le 23-07-2007 à 14:39:03  profilanswer
 

KangOl a écrit :

boost::filesystem


 
c'est vrai que c'est pratique, boost.
Faudra que je me décide à y jeter un oeil, le jour où le temps de compilation ne me rebutera plus trop [:petrus75]

n°1590209
toutsec
Posté le 23-07-2007 à 14:50:56  profilanswer
 

KangOl a écrit :

boost::filesystem


 

theshockwave a écrit :


 
c'est vrai que c'est pratique, boost.
Faudra que je me décide à y jeter un oeil, le jour où le temps de compilation ne me rebutera plus trop [:petrus75]


Ca sert à quoi ce machin? :??:

n°1590212
theshockwa​ve
I work at a firm named Koslow
Posté le 23-07-2007 à 14:52:49  profilanswer
 

c'est une lib cross-platform qui donne plein de solutions uniformes pour régler des problèmes pour lesquels on doit, sinon, aller tatonner dans les apis systèmes ... l'avantage, c'est que c'est propre :D

n°1590260
toutsec
Posté le 23-07-2007 à 15:33:02  profilanswer
 

Une autre question :o
 
Comment je peux faire pour que le programme trouve un fichier, fasse pleins d'opérations, puis passe au suivant.
Je cherche depuis tout à l'heure, et je n'avance pas :/

mood
Publicité
Posté le 23-07-2007 à 15:33:02  profilanswer
 

n°1590275
toutsec
Posté le 23-07-2007 à 15:43:35  profilanswer
 

J'ai fait ça pour le moment (pour tester), et ça écrit des chiffres bizarres ( 10^-53) dans mon fichier.

Code :
  1. int main()
  2. {
  3. ifstream spectre;
  4. ofstream fichier;
  5. fichier.open("coco.txt", ios::out|ios::app);
  6. dir = opendir("/home/vince/Boulot/spectre/pp" );
  7. if( dir == NULL )
  8. perror("" );
  9. while((entry = readdir(dir)) != NULL){
  10. //cout<<entry->d_name<<endl;
  11.  spectre.open(entry->d_name,ios::in);
  12.  float x,y;
  13.  int nlines=0;
  14.  while(spectre.good()){
  15.   spectre >> x >> y;
  16.   fichier << y;
  17.   if(spectre.good())
  18.    nlines++;
  19.  }
  20. }
  21. fichier.close();
  22. spectre.close();
  23. closedir(dir);
  24. return 0;
  25. }


Merci :)


Message édité par toutsec le 23-07-2007 à 15:43:59
n°1590307
theshockwa​ve
I work at a firm named Koslow
Posté le 23-07-2007 à 16:08:37  profilanswer
 

problème de fichier binaire en entrée avec une lecture de données textuelles ?

n°1590325
toutsec
Posté le 23-07-2007 à 16:26:09  profilanswer
 

En fait, les fichiers que je lis sont en deux colonnes, ce sont que des chiffres.
La première colonne je m'en fous, je ne veux que la seconde.
La, mon exemple est un peu "bête", c'est juste de lire la seconde colonne et de la copier dans un autre fichier.
 
J'aimerai bien, dans cet exemple, que tous les fichiers contenus dans le dossier soient lu et que la seconde colone de chaque fichier soit copiée.

n°1590483
toutsec
Posté le 23-07-2007 à 23:59:04  profilanswer
 

I need help :sweat:

n°1590493
IrmatDen
Posté le 24-07-2007 à 00:24:18  profilanswer
 

Salut,
 
On peut voir un échantillon type d'un fichier stp?

n°1590495
toutsec
Posté le 24-07-2007 à 00:27:37  profilanswer
 

Salut.
Quand je lis un dossier, il apparait des choses bizarres. Comme le . et le .. (voir en dessous), entre le 4 et le 5ième fichier et après le 5ième.


1.asc
2.asc
3.asc
4.asc
.
5.asc
..


Et quand je veux faire de l'écriture dans un autre fichier, ça me plante le prog...

terminate called after throwing an instance of 'std::ios_base::failure'
  what():  basic_filebuf::underflow error reading the file
Abandon (core dumped)

 
IrmatDen a écrit :

Salut,

 

On peut voir un échantillon type d'un fichier stp?


Un fichier? Lequel? Par exemple, c'est un fichier type à analyser, ils se ressemblent tous.

359.06764 436677

 

359.08969 451505

 

359.11174 462920

 

359.13378 407927

 

359.15583 336382

 


Message cité 1 fois
Message édité par toutsec le 24-07-2007 à 00:30:28
n°1590504
IrmatDen
Posté le 24-07-2007 à 00:57:14  profilanswer
 

toutsec a écrit :

Quand je lis un dossier, il apparait des choses bizarres. Comme le . et le .. (voir en dessous), entre le 4 et le 5ième fichier et après le 5ième.


1.asc
2.asc
3.asc
4.asc
.
5.asc
..



Normal; ton test ne planterait pas à ce moment là par le plus grand des hasards? Pourquoi tu ne te simplifies pas la vie avec boost::filesystem comme te l'a recommandé KangOl?

n°1590505
toutsec
Posté le 24-07-2007 à 00:58:51  profilanswer
 

Ouè ça plante avec le "." :o
 
Bon, je ne suis pas du tout un pro du c++, mais je vais me renseigner avec ce boost...

n°1590506
toutsec
Posté le 24-07-2007 à 01:01:42  profilanswer
 

Le truc, ce'st que je n'ai pas trop trop de temps en fait :o

 

edit : il faut m'aider là, sinon, j'vais pas m'en sortir :/


Message édité par toutsec le 24-07-2007 à 01:22:14
n°1590508
toutsec
Posté le 24-07-2007 à 01:34:45  profilanswer
 

Personne ne peut m'aider à résoudre mon problème?
Je n'ai pas le temps de faire un apprentissage de boost. Encore faudrait il que j'arrive à l'utiliser sous ubuntu :/

n°1590511
IrmatDen
Posté le 24-07-2007 à 02:02:59  profilanswer
 

Ben, si le nom de l'élément est '.' ou '..', bein, tu l'ignores... Je vois pas trop le souci en fait.

n°1590512
toutsec
Posté le 24-07-2007 à 02:23:04  profilanswer
 

Voila un code qui marche.

Code :
  1. int main()
  2. {
  3. ifstream spectre;
  4. ofstream fichier;
  5. fichier.open("coco.txt", ios::out|ios::app);
  6. dir = opendir("/pp" );
  7. if( dir == NULL )
  8. perror("" );
  9. while((entry = readdir(dir)) != NULL){
  10. string str1 = entry->d_name; // conversion en un string
  11. string str2( entry->d_name );
  12. string koko;
  13. koko = entry->d_name;
  14. koko.assign( entry->d_name );
  15. if(koko=="." || koko==".." )
  16.  continue;
  17.  spectre.open(entry->d_name,ios::in);
  18.  float x,y;
  19.  int nlines=0;
  20.  while(spectre.good()){
  21.   spectre >> x >> y;
  22.   fichier << y;
  23.   if(spectre.good())
  24.    nlines++;
  25.  }
  26. }
  27. fichier.close();
  28. spectre.close();
  29. closedir(dir);
  30. return 0;
  31. }


Maintenant, le problème, c'est qu'il ne se passe rien au niveau de la lecteure d'un fichier, je ne comprends pas pourquoi :/
 
edit : si je mets des cout dans le while(spectre.good()), il ne se passe rien. :/


Message édité par toutsec le 24-07-2007 à 02:27:31
n°1590513
toutsec
Posté le 24-07-2007 à 02:32:50  profilanswer
 

Je remercis d'avance celui qui résoud mon problème :o

n°1590518
toutsec
Posté le 24-07-2007 à 02:56:23  profilanswer
 

Ou alors, peut-on stocker tous les noms des fichiers dans un tableau de string? Après, il suffit de lire ce tableau et de faire les opérations voulues et c'est bon [:dawa].
Cela résoudrait mes problèmes en fait :/
Il faut m'aider :cry:

n°1590615
toutsec
Posté le 24-07-2007 à 11:03:46  profilanswer
 

Voila, en fait, le programme n'arrive pas à rentrer dans la boucle :

Code :
  1. while(spectre.good()){
  2.             spectre >> x >> y;
  3.            fichier << y;
  4.             if(spectre.good())
  5.                 nlines++;
  6.         }


Qulqu'un peut me dire pourquoi?


Message édité par toutsec le 24-07-2007 à 11:03:59
n°1590705
toutsec
Posté le 24-07-2007 à 12:19:01  profilanswer
 

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <iomanip>
  5. #include <sys/types.h>
  6. #include <dirent.h>
  7. DIR *dir;
  8. struct dirent *entry;
  9. using namespace std;
  10. int main()
  11. {
  12. ifstream spectre;
  13. ofstream fichier;
  14. float x, y;
  15. int nombrefichier=0;
  16. string koko;
  17. char* tab[50];
  18. for(int i = 0 ;i < 50 ; i++)
  19.  tab[i]=0;
  20. dir = opendir("/home/vince/Boulot/spectre/pp" );
  21. if( dir == NULL)
  22. perror("" );
  23. while((entry = readdir(dir)) != NULL){
  24.  string str1 = entry->d_name;
  25.  string str2( entry->d_name );
  26.  koko = entry->d_name;
  27.  koko.assign( entry->d_name );
  28.  if(koko=="." || koko==".." )
  29.   continue;
  30.  tab[nombrefichier]=entry->d_name;
  31.  nombrefichier++;
  32. }
  33. closedir(dir);
  34. cout<<"Le Tableau des fichiers"<<endl;
  35. for(int i = 0;i<nombrefichier;i++){
  36.  //cout<<tab[i]<<endl;
  37.  char* gorges;
  38.  gorges = tab[i];
  39.  cout<<gorges<<endl;
  40.  spectre.open(gorges,ios::in); // le fait de mettre ça, fait tout foirer.
  41.  /*while(spectre.good()){
  42.   spectre  >> x >> y;
  43.   cout<<x<<" "<<y<<endl;
  44.   cout << "Appuyez sur entrée pour continuer...";
  45.        cin.ignore( numeric_limits<streamsize>::max(), '\n' );
  46.   //fichier << y;
  47.  }*/
  48.  spectre.close();
  49. cout<<gorges<<endl;
  50. }
  51. //fichier.close();
  52. return 0;
  53. }
 

J'ai progressé. J'arrive à stocker tous les noms dans un tableau de char*.
Mais maintenant, si je veux ouvrir un fichier pour de la lecture, ça bug compltément. Et ça fait foirer la console :/
http://img261.imageshack.us/img261/2671/capturexx1.th.png


Message édité par toutsec le 24-07-2007 à 12:20:18
n°1590724
toutsec
Posté le 24-07-2007 à 12:42:02  profilanswer
 

Personne n'a d'idée?
Parce que ça m'arrangerait grandement :/

 
Code :
  1. cout<<"Le Tableau des fichiers"<<endl;
  2. for(int i = 0;i<nombrefichier;i++){
  3.  //cout<<tab[i]<<endl;
  4.  //char* gorges;
  5.  //gorges = tab[i];
  6.  //cout<<gorges<<endl;
  7.  spectre.open(tab[i],ios::in);
  8.  while(spectre.good()){
  9.   cout<<i<<endl;
  10.   spectre  >> x >> y;
  11.   cout<<x<<" "<<y<<endl;
  12.   cout << "Appuyez sur entrée pour continuer...";
  13.        cin.ignore( numeric_limits<streamsize>::max(), '\n' );
  14.   //fichier << y;
  15.  }
  16.  spectre.close();
  17. //cout<<gorges<<endl;
  18. }


J'ai fait ça, mais comme d'hab, ça ne veut pas rentrer dans la boucle while(spectre.good()).
Je commence à craquer :/


Message édité par toutsec le 24-07-2007 à 12:42:26
n°1590730
_darkalt3_
Proctopathe
Posté le 24-07-2007 à 12:44:21  profilanswer
 

parce que spectre.good() renvoie systématiquement false ?


---------------
Töp of the plöp
n°1590750
toutsec
Posté le 24-07-2007 à 13:04:52  profilanswer
 

Bah oui c'est ça, mais la question, c'est pourquoi?

n°1590755
KangOl
Profil : pointeur
Posté le 24-07-2007 à 13:10:41  profilanswer
 

et un std::vector<std::string> pour ton tableau, merci ...

n°1590757
toutsec
Posté le 24-07-2007 à 13:14:34  profilanswer
 

KangOl a écrit :

et un std::vector<std::string> pour ton tableau, merci ...


Pour mon tableau de noms de fichiers?
Il faut passer des char* dans le spectre.open(tab[i],ios::in);
Donc avec des string, il faut faire une conversion, mais mon problème ne se trouve pas là. Je verrai ça plus tard.
Pour le moment, je dois savoir pourquoi ça ne rentre pas dans la boucle while...


Message édité par toutsec le 24-07-2007 à 13:14:49
n°1590760
_darkalt3_
Proctopathe
Posté le 24-07-2007 à 13:18:19  profilanswer
 

toutsec a écrit :

Bah oui c'est ça, mais la question, c'est pourquoi?


Le fichier est mauvais ? tu l'ouvres en binaire ou texte au lieu du contraire ? ...


---------------
Töp of the plöp
n°1590765
toutsec
Posté le 24-07-2007 à 13:26:07  profilanswer
 

Je suis vraiment trop con :/
 
En fait, dans l'arborescence des fichiers, je compil et je lance le programme dans /home (c'est un exemple)
Pour lire les fichiers, je lui dis d'aller dans /home/pp et il me sort le nom des fichiers.
Quand je passe le nom des fichiers pour la lecteur, je ne mets QUE le nom. Donc ils ne les trouvent pas, vu qu'ils ne sont pas dans /home mais dans /home/pp.
 
Je dois donc modifier les noms des fichiers pour mettre /home/pp devant et là ça roule, normalement.
 
Maintenant c'est le temps de la question :  
Comment je peux faire pour que le scan du dossier me renvoi "/pp/nomfichier.asc" au lieu de "nomfichier.asc" ?

n°1590767
KangOl
Profil : pointeur
Posté le 24-07-2007 à 13:29:37  profilanswer
 

bha il peut pas, a toi d'avoir une constante "directory" et de l'utiliser

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  un dossier avec plusieurs fichiers à traiter : console cassée

 

Sujets relatifs
Macro unique pour plusieurs fichiers excels Récupérer le chemin du dossier courant
[Batch] recuperer le log des fichiers copiésComment ouvrir tous les fichiers qui commence par les meme lettres?
plusieurs valeurs dans un même champsPlusieurs flash dans une page html - probleme avec swfObject
Extraction de plusieurs requêtes SQL Server sous Word ou Excelfichiers .doc corrompus...
Gestion de plusieurs fichiers Excel. 
Plus de sujets relatifs à : un dossier avec plusieurs fichiers à traiter : console cassée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR