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

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

Marsh Posté le 10-10-2003 à 15:11:56    

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
Reply

Marsh Posté le 10-10-2003 à 15:11:56   

Reply

Marsh Posté le 10-10-2003 à 15:16:33    

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

Reply

Marsh Posté le 10-10-2003 à 15:21:12    

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

Reply

Marsh Posté le 10-10-2003 à 15:22:04    

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

Reply

Marsh Posté le 10-10-2003 à 15:24:29    

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.

Reply

Marsh Posté le 10-10-2003 à 15:26:08    

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 ?

Reply

Marsh Posté le 10-10-2003 à 15:32:27    

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

Reply

Marsh Posté le 10-10-2003 à 15:33:28    

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

Reply

Marsh Posté le 10-10-2003 à 15:34:31    

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

Reply

Marsh Posté le 10-10-2003 à 15:39:05    

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
Reply

Marsh Posté le 10-10-2003 à 15:39:05   

Reply

Marsh Posté le 10-10-2003 à 16:21:51    

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
Reply

Marsh Posté le 10-10-2003 à 17:18:15    

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

Reply

Marsh Posté le 10-10-2003 à 17:34:58    

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

Reply

Marsh Posté le 10-10-2003 à 17:35:42    

à 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
Reply

Marsh Posté le 10-10-2003 à 17:41:11    

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

Reply

Marsh Posté le 10-10-2003 à 18:07:14    

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

Reply

Marsh Posté le 10-10-2003 à 18:10:54    

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

Reply

Marsh Posté le 13-10-2003 à 10:48:10    

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

Reply

Marsh Posté le 13-10-2003 à 12:06:34    

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

Reply

Marsh Posté le 14-10-2003 à 14:27:40    

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


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-10-2003 à 13:25:00    

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

Reply

Marsh Posté le 07-04-2004 à 16:58:55    

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 !
Reply

Marsh Posté le 08-04-2004 à 07:50:48    

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


---------------
Allez doucement n'empèche pas d'arriver !
Reply

Marsh Posté le 08-04-2004 à 14:08:17    

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 !
Reply

Marsh Posté le 08-04-2004 à 14:25:59    

Reply

Marsh Posté le 08-04-2004 à 15:21:40    

merci j'y vais


---------------
Allez doucement n'empèche pas d'arriver !
Reply

Marsh Posté le 09-04-2004 à 03:09:58    

je dirais au hasard le grand classique:
 

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

Reply

Marsh Posté le 09-04-2004 à 03:10:44    

on while(infs.get(c))

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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