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

un dossier avec plusieurs fichiers à traiter : console cassée - C++ - Programmation

Marsh Posté le 23-07-2007 à 13:37:44    

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
Reply

Marsh Posté le 23-07-2007 à 13:37:44   

Reply

Marsh Posté le 23-07-2007 à 13:49:28    

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

Reply

Marsh Posté le 23-07-2007 à 13:52:05    

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 :/

Reply

Marsh Posté le 23-07-2007 à 14:21:49    

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
Reply

Marsh Posté le 23-07-2007 à 14:35:35    

boost::filesystem

Reply

Marsh Posté le 23-07-2007 à 14:37:42    

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 !

Reply

Marsh Posté le 23-07-2007 à 14:39:03    

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]

Reply

Marsh Posté le 23-07-2007 à 14:50:56    

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? :??:

Reply

Marsh Posté le 23-07-2007 à 14:52:49    

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

Reply

Marsh Posté le 23-07-2007 à 15:33:02    

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 :/

Reply

Marsh Posté le 23-07-2007 à 15:33:02   

Reply

Marsh Posté le 23-07-2007 à 15:43:35    

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
Reply

Marsh Posté le 23-07-2007 à 16:08:37    

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

Reply

Marsh Posté le 23-07-2007 à 16:26:09    

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.

Reply

Marsh Posté le 23-07-2007 à 23:59:04    

I need help :sweat:

Reply

Marsh Posté le 24-07-2007 à 00:24:18    

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

Reply

Marsh Posté le 24-07-2007 à 00:27:37    

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
Reply

Marsh Posté le 24-07-2007 à 00:57:14    

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?

Reply

Marsh Posté le 24-07-2007 à 00:58:51    

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...

Reply

Marsh Posté le 24-07-2007 à 01:01:42    

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
Reply

Marsh Posté le 24-07-2007 à 01:34:45    

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 :/

Reply

Marsh Posté le 24-07-2007 à 02:02:59    

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

Reply

Marsh Posté le 24-07-2007 à 02:23:04    

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
Reply

Marsh Posté le 24-07-2007 à 02:32:50    

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

Reply

Marsh Posté le 24-07-2007 à 02:56:23    

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:

Reply

Marsh Posté le 24-07-2007 à 11:03:46    

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
Reply

Marsh Posté le 24-07-2007 à 12:19:01    

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
Reply

Marsh Posté le 24-07-2007 à 12:42:02    

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
Reply

Marsh Posté le 24-07-2007 à 12:44:21    

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


---------------
Töp of the plöp
Reply

Marsh Posté le 24-07-2007 à 13:04:52    

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

Reply

Marsh Posté le 24-07-2007 à 13:10:41    

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

Reply

Marsh Posté le 24-07-2007 à 13:14:34    

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
Reply

Marsh Posté le 24-07-2007 à 13:18:19    

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
Reply

Marsh Posté le 24-07-2007 à 13:26:07    

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" ?

Reply

Marsh Posté le 24-07-2007 à 13:29:37    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed