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

  FORUM HardWare.fr
  Programmation
  C

  aide à propos strstr

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

aide à propos strstr

n°1225577
mirascheat
Posté le 18-10-2005 à 17:24:00  profilanswer
 

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

mood
Publicité
Posté le 18-10-2005 à 17:24:00  profilanswer
 

n°1225600
Taz
bisounours-codeur
Posté le 18-10-2005 à 17:47:57  profilanswer
 

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

n°1225607
mirascheat
Posté le 18-10-2005 à 17:55:04  profilanswer
 

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

n°1225991
mirascheat
Posté le 19-10-2005 à 10:58:04  profilanswer
 

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

n°1226079
Elmoricq
Modérateur
Posté le 19-10-2005 à 12:16:07  profilanswer
 

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
n°1226083
chrisbk
-
Posté le 19-10-2005 à 12:27:41  profilanswer
 

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

n°1226084
chrisbk
-
Posté le 19-10-2005 à 12:28:02  profilanswer
 

pis y'a 49closes pourry

n°1226103
mirascheat
Posté le 19-10-2005 à 12:42:49  profilanswer
 

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)

n°1226123
theshockwa​ve
I work at a firm named Koslow
Posté le 19-10-2005 à 13:12:01  profilanswer
 

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]

n°1226125
Elmoricq
Modérateur
Posté le 19-10-2005 à 13:13:31  profilanswer
 

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 ?

mood
Publicité
Posté le 19-10-2005 à 13:13:31  profilanswer
 

n°1226185
mirascheat
Posté le 19-10-2005 à 14:03:53  profilanswer
 

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
n°1226186
mirascheat
Posté le 19-10-2005 à 14:05:12  profilanswer
 

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:

n°1226240
Emmanuel D​elahaye
C is a sharp tool
Posté le 19-10-2005 à 14:37:55  profilanswer
 

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/
n°1227416
chrisbk
-
Posté le 20-10-2005 à 19:39:33  profilanswer
 

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

n°1236207
mirascheat
Posté le 02-11-2005 à 11:15:46  profilanswer
 

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);

n°1236228
Elmoricq
Modérateur
Posté le 02-11-2005 à 11:47:16  profilanswer
 

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
n°1236243
mirascheat
Posté le 02-11-2005 à 12:06:46  profilanswer
 

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

n°1236267
Elmoricq
Modérateur
Posté le 02-11-2005 à 12:28:56  profilanswer
 

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

n°1236289
mirascheat
Posté le 02-11-2005 à 13:03:18  profilanswer
 

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

n°1236293
Elmoricq
Modérateur
Posté le 02-11-2005 à 13:05:47  profilanswer
 

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]  


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

  aide à propos strstr

 

Sujets relatifs
[Aide] Déplacer tête d'impressionAide requête SQL Access
Aide sur les variables($) variables(adj)[GTK] probleme de lancement de fonction C a l'aide d'un bouton
aide sur un sript de sauvegardeAide pour petit prog
DE L'AIDE !!! comment animer un bouton???[AIDE PHP] manque une ou 2 commandes sur mon script...
[VISUAL] ajouter une aide dans le dynamic help[AIDE] phpnuke
Plus de sujets relatifs à : aide à propos strstr


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