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

  FORUM HardWare.fr
  Programmation
  C++

  Recherche d'une chaine dans un fichier, pourquoi ça plante sur .exe ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Recherche d'une chaine dans un fichier, pourquoi ça plante sur .exe ?

n°536189
antsite
Je me souviens
Posté le 10-10-2003 à 15:11:56  profilanswer
 

Salut,
je n'y comprends que dale, ce programme marche mais il n'arrive pas à ouvrire les fichiers .exe, la méthode open ne marche pas, j'ai essayé en binaire et tout et tout...
voila le code en entier, je pense que c'est nécessaire, au passage j'essaie le plus possible de le faire en c++ et non en c, alors s'il y a des choses que je dois modifier pour cela, dite le moi ;)
 

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <io.h> //_findfirst routines (system calls)
  5. class schClass
  6. {
  7. std::ifstream infs;
  8. public:
  9.  std::string fil, str, pth;
  10.  bool isIn();
  11. };
  12. bool schClass::isIn()
  13. {
  14. std::string tmp;
  15. unsigned int i = 0;
  16. char c;
  17. if(pth[pth.length()-1] == '\\')
  18.  tmp = pth + fil;
  19. else
  20.  tmp = pth + "\\" + fil;
  21. infs.open(tmp.data());
  22. if(!infs)
  23. {
  24.  std::cout << "Error opening ~ " << fil << "\n";
  25.  return false;
  26. }
  27. while((c=infs.get()) != EOF && i != str.length())
  28. {
  29.  if(c == str[i])
  30.   i++;
  31.  else
  32.   i = 0;
  33. }
  34. infs.close();
  35. if(i == str.length())
  36.  return true;
  37. return false;
  38. }
  39. int main()
  40. {
  41. schClass sch;
  42. int r;
  43. _finddata_t fdata;
  44. std::cout << "Basic Search, by ANT\n"
  45.    "\tOctober 2003\n\n"
  46.    "Path ~ ";
  47. getline(std::cin, sch.pth);
  48. if(sch.pth == "" )
  49.  sch.pth = ".";
  50. std::cout << "File search ~ ";
  51. getline(std::cin, sch.fil);
  52. if(sch.fil == "" )
  53. {
  54.  std::cout << "Nothing to search" << std::endl;
  55.  return 1;
  56. }
  57. std::cout << "Contain string ~ ";
  58. getline(std::cin, sch.str);
  59. if(sch.pth[sch.pth.length()-1] == '\\')
  60.  sch.fil = sch.pth + sch.fil;
  61. else
  62.  sch.fil = sch.pth + "\\" + sch.fil;
  63. if((r=_findfirst(sch.fil.data(), &fdata)) == -1)
  64. {
  65.  std::cout << "Nothing found for " << sch.fil << std::endl;
  66.  return 1;
  67. }
  68. if(sch.str == "" )
  69. {
  70.  do
  71.  {
  72.   sch.fil = fdata.name;
  73.   if(fdata.attrib != _A_SUBDIR && sch.fil != "." && sch.fil != ".." )
  74.    std::cout << sch.fil << "\n";
  75.  }
  76.  while(_findnext(r, &fdata) != -1);
  77. }
  78. else
  79. {
  80.  do
  81.  {
  82.   sch.fil = fdata.name;
  83.   if(fdata.attrib != _A_SUBDIR && sch.fil != "." && sch.fil != ".." && sch.isIn())
  84.    std::cout << sch.fil << "\n";
  85.  }
  86.  while(_findnext(r, &fdata) != -1);
  87. }
  88. _findclose(r);
  89. }


 
merci
   ANT


Message édité par antsite le 10-10-2003 à 15:21:45
mood
Publicité
Posté le 10-10-2003 à 15:11:56  profilanswer
 

n°536197
Kristoph
Posté le 10-10-2003 à 15:16:33  profilanswer
 

C'est en quel langage ? C ou C++ ? Et tu appelles souvent des méthodes dont le nom commence par un _ (_findfirst) ?

n°536200
antsite
Je me souviens
Posté le 10-10-2003 à 15:21:12  profilanswer
 

ben j'aimerais le faire en c++, mais le genre de fonction _findfirst ben j'ai pas le choix, c'est pas standard

n°536202
Taz
bisounours-codeur
Posté le 10-10-2003 à 15:22:04  profilanswer
 

entre tes noms abscons, tes fonctions pas standards, ton algorithme douteux, ton manque d'explication, j'ai du mal à te répondre

n°536207
antsite
Je me souviens
Posté le 10-10-2003 à 15:24:29  profilanswer
 

comment tu veux faire une recherche de fichiers en standard ?
essaie de faire abstraction des noms assez courts
ben si tu veux c'est un programme qui doit tout d'abord rechercher les fichiers correspondants à une chaine de recherche (parametre du findfirst), ensuite pour ceux trouvée il doit recherche si une chaine précise est dedans, ça marche bien pour les fichiers textes disons, mais pour les exe, infs.open ne marche pas, infs est null.

n°536211
Taz
bisounours-codeur
Posté le 10-10-2003 à 15:26:08  profilanswer
 

1) pas possible)
2) heink ?
3) les fonctions en _ ton système dois tu surement te fournir mieux
4) t'as un problème de C++ ou de windowserie ?

n°536228
antsite
Je me souviens
Posté le 10-10-2003 à 15:32:27  profilanswer
 

problème de c++, ben si tu pouvais me donner quelques trucs pour rendre ce code plus potable en c++, je suis preneur, le problème ben je comprends pas pourquoi la méthode open de la classe ifstream bloque dans mon code sur les .exe, c'est zarb quand même, c'est même pas un problème de recherche, cette recherche se passe très bien...

n°536230
Taz
bisounours-codeur
Posté le 10-10-2003 à 15:33:28  profilanswer
 

classe ifstream bloque dans mon code sur les .exe
 
 
ça veut dire quoi ? t'as essaye en binaire ?

n°536233
antsite
Je me souviens
Posté le 10-10-2003 à 15:34:31  profilanswer
 

oui comme je l'ai écrit j'ai essayé en binaire
et j'ai dit la méthode open de ifstream...

n°536239
Taz
bisounours-codeur
Posté le 10-10-2003 à 15:39:05  profilanswer
 

heink ?
 
de toutes façons
 
infs.open(tmp.data());
 
foire puisque data() n'est pas terminé par un '\0'


Message édité par Taz le 10-10-2003 à 15:39:22
mood
Publicité
Posté le 10-10-2003 à 15:39:05  profilanswer
 

n°536307
HelloWorld
Salut tout le monde!
Posté le 10-10-2003 à 16:21:51  profilanswer
 

Isole le problème dans un cas comme ça...
Créé un petit fichier de test qui tente juste d'ouvrir un fichier exe et d'y trouver une chaine...
Ton bug ça pue l'ouverture en mode texte.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°536395
antsite
Je me souviens
Posté le 10-10-2003 à 17:18:15  profilanswer
 

quand je fais dans le main une ouverture simple de .exe, mode texte ou binaire, ça marche, je vais essayer avec le \0 comme me le conseille Taz

n°536407
Taz
bisounours-codeur
Posté le 10-10-2003 à 17:34:58  profilanswer
 

utilise c_str()
 
le problème il est tout trouvé

n°536408
antsite
Je me souviens
Posté le 10-10-2003 à 17:35:42  profilanswer
 

à cause du c_str() ?
sinon je demandais dans un autre post, tu as bien dit pas de char* en c++ ? juste pour confirmer...
 
edit : oubli d'un mot


Message édité par antsite le 10-10-2003 à 17:41:44
n°536413
Taz
bisounours-codeur
Posté le 10-10-2003 à 17:41:11  profilanswer
 

si tu me donnes une seule bonne raison pour préférer les char*

n°536442
Konar
Posté le 10-10-2003 à 18:07:14  profilanswer
 

pour mettre du binaire, entre un string et un char* je choisis le char* sans hésiter, me semble plus logique...

n°536443
Taz
bisounours-codeur
Posté le 10-10-2003 à 18:10:54  profilanswer
 

faudrait lire un peu le code.
une string permet manipuler des chaines de caracteres, mais les std::string sont capables de mainpuler toute chaine de caracteres sans restriction.
 
cela dit pour la lecture du binaire, un char* ou mieux un vector<char> est bien mieux

n°537951
antsite
Je me souviens
Posté le 13-10-2003 à 10:48:10  profilanswer
 

J'ai changé de méthode, c_str() à la place de data(), ça change rien...

n°538053
Taz
bisounours-codeur
Posté le 13-10-2003 à 12:06:34  profilanswer
 

ça change que ça ne plante plus déjà. après tu vois avec tes windowseries

n°539233
blackgodde​ss
vive le troll !
Posté le 14-10-2003 à 14:27:40  profilanswer
 

j'ai executé ton code, et chez moi ca a l'air de fonctionner (win xp / vc++7)


---------------
-( BlackGoddess )-
n°541298
antsite
Je me souviens
Posté le 16-10-2003 à 13:25:00  profilanswer
 

bizarre quand même cette histoire (win xp aussi, mingw, je vais essayer de changer de compilo, mais bon...)

n°694836
trmassoud
Posté le 07-04-2004 à 16:58:55  profilanswer
 

Salut,
 
je veux faire un programme similaire au tiens mais qui me permette de rechercher une chaine qui commence par un ";" et qui se termine ppar la chaine recherchée (c des fichiers zarb sur lesquels je bosse...)
 
j'ai donc adapté ton programme et il fonctionne impec sauf que le close() sur le fichier dans la méthode isIn() foire (je test sur if(!infs) ) ce qui fait que je ne peux pas ouvrir le fichier suivant du répertoire...  
 
tu as (avais plutôt ça date un peu) rencontré ce problème ???
 
ps : jsuis avec Visual C++ 6 et windows 2000


Message édité par trmassoud le 08-04-2004 à 14:06:57

---------------
Allez doucement n'empèche pas d'arriver !
n°695421
trmassoud
Posté le 08-04-2004 à 07:50:48  profilanswer
 

personne pour me dire comment ça se ferme un ifstream ?


---------------
Allez doucement n'empèche pas d'arriver !
n°695456
trmassoud
Posté le 08-04-2004 à 14:08:17  profilanswer
 

ou un lien vers des explications sur ifstream ou c_str ?
 
parceque je cherche mais je trouve rien de très claire pour moi (surtout quand c'est écrit en english)


---------------
Allez doucement n'empèche pas d'arriver !
n°695479
Joel F
Real men use unique_ptr
Posté le 08-04-2004 à 14:25:59  profilanswer
 
n°695570
trmassoud
Posté le 08-04-2004 à 15:21:40  profilanswer
 

merci j'y vais


---------------
Allez doucement n'empèche pas d'arriver !
n°696179
bjone
Insert booze to continue
Posté le 09-04-2004 à 03:09:58  profilanswer
 

je dirais au hasard le grand classique:
 

Code :
  1. char c;
  2. ....
  3. while((c=infs.get()) != EOF

n°696180
Taz
bisounours-codeur
Posté le 09-04-2004 à 03:10:44  profilanswer
 

on while(infs.get(c))

mood
Publicité
Posté le   profilanswer
 


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

  Recherche d'une chaine dans un fichier, pourquoi ça plante sur .exe ?

 

Sujets relatifs
[PHP-GD] Transformer un fichier texte en image ...Recherche Heuristique
Format d un fichier AVIpb upload fichier
Recherche de ressemblances entre chaines de caractères[C++] Récupérer une chaine saisie par l'utilisateur : cin, getline...
Recherche doc sur Dreamwaver et ActionScriptFaire 1 recherche sur 1 frame dans 1 autre frame [Résolu, code déposé]
envois de fichier - truc de oufimporter des données d un fichier vers mysql
Plus de sujets relatifs à : Recherche d'une chaine dans un fichier, pourquoi ça plante sur .exe ?


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