aide à propos strstr

aide à propos strstr - C - Programmation

Marsh Posté le 18-10-2005 à 17:24:00    

Bonjour,
 
Je voudrais "splitter" un fichier en fonction d'un pattern.
Ainsi je lis un fichier1 ligne par ligne, si je ne trouve pas mon pattern dans ma ligne je copie la ligne dans fichier2 et ainsi de suite jusqu'à l'obtention de mon pattern.
Mais rien ne s'écrit dans mon fichier2 ... quelqu'un pour m'aider ...merci  :D  
 

Code :
  1. FILE* fichier;
  2. FILE* fichier2;
  3. char stringbuf[200];
  4. char *pattern = "REQUEST: QUIT";
  5. fichier = fopen(Filename, "r" );
  6. fichier2 = fopen("./ftp_1.txt", "a" );
  7. while(fgets(stringbuf, 200, fichier) != NULL){
  8. if(strstr(stringbuf, pattern) != NULL){
  9. fputs(stringbuf, fichier2);
  10. fclose(fichier2);
  11. }
  12. }
  13. fclose(fichier2);
  14. fclose(fichier);
  15. }

Reply

Marsh Posté le 18-10-2005 à 17:24:00   

Reply

Marsh Posté le 18-10-2005 à 17:47:57    

c'est quoi ce close dans ton while ...

Reply

Marsh Posté le 18-10-2005 à 17:55:04    

c'est une merde que j'ai effacé maintenant :-)

Reply

Marsh Posté le 19-10-2005 à 10:58:04    

Est-ce que ca peut être du au fait que le fichier string.h est defaillant ?

Reply

Marsh Posté le 19-10-2005 à 12:16:07    

string.h défaillant ? [:mlc]
 
Sinon il se passe quoi dans ton programme si l'un des deux fopen() échoue ?
Réponse : fgets() ou fputs() retournent NULL et il ne se passe rien, mais comme tu ne testes pas l'erreur, tu ne le sais pas. :o
 
En plus pour peu que les lignes de ton fichier fassent plus de 200 caractères, fgets() lira ta ligne par morceaux. Ca fausse ton algorithme.


Message édité par Elmoricq le 19-10-2005 à 12:17:42
Reply

Marsh Posté le 19-10-2005 à 12:27:41    

bin si t'as pas de bol ton pattern tombe a la jonction de tes deux fgets et zou

Reply

Marsh Posté le 19-10-2005 à 12:28:02    

pis y'a 49closes pourry

Reply

Marsh Posté le 19-10-2005 à 12:42:49    

Je ne pense pas que mes deux fopen échoue car :
1- dans tous les cas mon fichier ftp_1.txt est créé
2- j'ai fait des tests pour que soit écrit des lignes de Filename dans ftp_1.txt et en effet il m'écrit des lignes de Filename dans ftp_1.ftp
Concernant les 200 caractères je suis sur que ce n'est pas le cas d'erreur => aucune ligne ne dépasse 200 caractères ...
Je n'arrive pas à entrer dans la boucle if alors que je devrais, il y a un problème au niveau du strstr, c'est pour ca que je me disais soit :
1- le string.h est défaillant
2- je ne suis pas sur que stringbuf soit un char*
car je lis : char *strstr(const char *s1, const char *s2)

Reply

Marsh Posté le 19-10-2005 à 13:12:01    

il se peut que :
1 - tu utilises mal les fonctions
2 - tu ne lises pas complètement les réponses qu'on te donne
 
[:pingouino]

Reply

Marsh Posté le 19-10-2005 à 13:13:31    

mirascheat a écrit :

1- le string.h est défaillant


Tu es au courant qu'il n'y a pas d'implémentation dans un fichier en-tête ?

Reply

Marsh Posté le 19-10-2005 à 13:13:31   

Reply

Marsh Posté le 19-10-2005 à 14:03:53    

Elmoricq a écrit :

Tu es au courant qu'il n'y a pas d'implémentation dans un fichier en-tête ?


 
non je ne le savais pas ... mais maintenant oui  :D


Message édité par mirascheat le 19-10-2005 à 14:04:36
Reply

Marsh Posté le 19-10-2005 à 14:05:12    

theshockwave a écrit :

il se peut que :
1 - tu utilises mal les fonctions
2 - tu ne lises pas complètement les réponses qu'on te donne
 
[:pingouino]


 
1- ca c'est sur sinon je ne serai pas là ...
2- je lis mais je dois etre aveugle ...  :cry:

Reply

Marsh Posté le 19-10-2005 à 14:37:55    

mirascheat a écrit :

1- ca c'est sur sinon je ne serai pas là ...
2- je lis mais je dois etre aveugle ...  :cry:


Avec ce fichier de données :  


aaa
REQUEST: QUIT xxx
bbb
REQUEST: QUIT yyy
ccc


Ce code:


#include <stdio.h>
#include <string.h>
 
#define Filename "data.txt"
 
int main (void)
{
   char stringbuf[200];
   char const *pattern = "REQUEST: QUIT";
 
   FILE *fichier = fopen (Filename, "r" );
 
   if (fichier != NULL)
   {
      FILE *fichier2 = fopen ("./ftp_1.txt", "w" );
 
      if (fichier2 != NULL)
      {
         while (fgets (stringbuf, sizeof stringbuf, fichier) != NULL)
         {
            if (strstr (stringbuf, pattern) != NULL)
            {
               fputs (stringbuf, fichier2);
               break;
            }
         }
         fclose (fichier2);
      }
      fclose (fichier);
   }
   return 0;
}


donne ceci:


REQUEST: QUIT xxx


Alors c'est quoi le problème ?
 
Si tu ne sais pas décrire le comportement attendu, donne au moins un exemple de fichier d'entrée et un exemple de fichier de sortie.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 20-10-2005 à 19:39:33    

han y mets pas ses constantes en majuscules [:icon11]

Reply

Marsh Posté le 02-11-2005 à 11:15:46    

J'ai essayé de réiterer l'opération pour avoir dans chaque fichier ftp_X.txt une session ftp malheureusement ca ne marche que pour la 1ère session ...
 

Code :
  1. FILE* fichier;
  2. FILE* fichier2;
  3. char stringbuf[500];
  4. char output_filename[100];
  5. char const *pattern = "Request: QUIT";
  6. int file_nb = 1;
  7.     fichier = fopen(Filename, "r" );
  8.     if(fichier != NULL){
  9.         while(fgets(stringbuf, sizeof stringbuf, fichier) != NULL){
  10.             if(fichier2 == NULL){
  11.                 sprintf(output_filename, "./ftp_%d.txt", file_nb);
  12.                 file_nb ++;
  13.                 fichier2 = fopen(output_filename, "a" );
  14.             }
  15.             if(fichier2 != NULL){
  16.                 fputs(stringbuf, fichier2);
  17.                 if(strstr(stringbuf, pattern) != NULL){
  18.                 fclose(fichier2);
  19.                 } 
  20.             }
  21.         }
  22.     }
  23.     fclose(fichier);

Reply

Marsh Posté le 02-11-2005 à 11:47:16    

Le test "if (fichier2 == NULL)" ne se déclenchera qu'une seule fois dans ton code, puisqu'il n'est plus NULL après le premier fopen() réussi.
 
Juste après ton "fclose(fichier2)", tu devrais mettre ce dernier à NULL pour pouvoir redéclencher le test.
 
Et ajouter un test d'erreur à fopen() ad hoc pour fichier2.
 
Question : es-tu sûr de vouloir ouvrir tes fichiers en mode append ? J'ai l'impression -sans connaître la finalité de ton programme- que le mode write ("w" ) serait plus approprié.

Message cité 1 fois
Message édité par Elmoricq le 02-11-2005 à 11:52:10
Reply

Marsh Posté le 02-11-2005 à 12:06:46    

Elmoricq a écrit :

Le test "if (fichier2 == NULL)" ne se déclenchera qu'une seule fois dans ton code, puisqu'il n'est plus NULL après le premier fopen() réussi.
 
Juste après ton "fclose(fichier2)", tu devrais mettre ce dernier à NULL pour pouvoir redéclencher le test.


 
J'ai fait ceci mais ca n'a rien changé :
 

Code :
  1. fichier = fopen(Filename, "r" );
  2.     if(fichier != NULL){
  3.         while(fgets(stringbuf, sizeof stringbuf, fichier) != NULL){
  4.             if(fichier2 == NULL){
  5.                 sprintf(output_filename, "./ftp_%d.txt", file_nb);
  6.                 file_nb ++;
  7.                 fichier2 = fopen(output_filename, "a" );
  8.             }
  9.             if(fichier2 != NULL){
  10.                 fputs(stringbuf, fichier2);
  11.                 if(strstr(stringbuf, pattern) != NULL){
  12.                     fclose(fichier2);
  13.                     fichier2 == NULL;
  14.                 }   
  15.             }
  16.         }
  17.     }
  18.     fclose(fichier);


 

Elmoricq a écrit :

Et ajouter un test d'erreur à fopen() ad hoc pour fichier2.


 
Je ne vois pas de quoi tu veux parler ...
 

Elmoricq a écrit :

Question : es-tu sûr de vouloir ouvrir tes fichiers en mode append ? J'ai l'impression -sans connaître la finalité de ton programme- que le mode write ("w" ) serait plus approprié.


 
Je suppose que tu as raison mais qu'est ce que ca change vraiment ? (je suis toujours ouvert pour en apprendre plus)
 
Merci

Reply

Marsh Posté le 02-11-2005 à 12:28:56    

mirascheat a écrit :

J'ai fait ceci mais ca n'a rien changé :


 
"fichier2 == NULL" ?! [:le poney de mr pink]
 
 

Citation :

Je ne vois pas de quoi tu veux parler ...


 
Si ton programme ne parvient pas à créer de nouveau fichier, pour une raison ou pour une autre (filesystem plein, droits insuffisants ou autre), ton programme continuera à lire ton premier fichier et ne fera rien, sans qu'aucune erreur ne soit détectée.
C'est génant je pense.
 
 

Citation :

Je suppose que tu as raison mais qu'est ce que ca change vraiment ? (je suis toujours ouvert pour en apprendre plus)


 
Ca change que si le fichier existe déjà, avec "w" il sera écrasé, alors qu'avec "a" tu écris à la suite de ce qui existe déjà.

Reply

Marsh Posté le 02-11-2005 à 13:03:18    

1- Je ne vois vraiment pas comment reaffecter à mon fopen la valeur NULL  :pt1cable:  
2- Je le fais ce test, non ?

Code :
  1. if(fichier2 != NULL)


3- C'est bien ce que je pensais mais je préfère ne rien écraser ...
Merci

Reply

Marsh Posté le 02-11-2005 à 13:05:47    

mirascheat a écrit :

1- Je ne vois vraiment pas comment reaffecter à mon fopen la valeur NULL  :pt1cable:


 
T'as pas l'impression d'avoir un "=" en trop ?  [:petrus75]  

Reply

Sujets relatifs:

Leave a Replay

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