[C] Plantage incompréhensible...

Plantage incompréhensible... [C] - C - Programmation

Marsh Posté le 18-04-2006 à 19:49:41    

Pour mes études, je dois réaliser un projet qui permet, à partir de fiches de stage en .txt remplies par les étudiants selon le modèle ci-dessous, d'extraire les informations intéressantes (après les ":" ou la case cochée) et d'écrire seulement toutes ces informations dans un seul fichier texte qui devra à terme contenir des instruction SQL qui serviront à remplir une base de donnée mais là n'est pas le sujet.  
 
--------------------------------------------------------------------------------
DESCRIPTIF DU STAGE
 
 
Titre du rapport :
Raison sociale de l'entreprise :
Code postal :
Ville :
 
 
année :
cd :
répertoire :
 
 
Domaine(s) d'activités abordés durant le stage :
[  ]  Type informatique
[  ]  Type réseaux
[  ]  Type internet
[  ]  Type téléphonie
[  ]  Type commercial
[  ]  Type maintenance gros systèmes
[  ]  Type opérateur radiocom
[  ]  Type maintenance et gestion de matériel réseau ou téléphonie de grande capacité
[  ]  Type prestation de services
 
 
Résumé :  
 
 
--------------------------------------------------------------------------------
 
 
J'ai fait le programme suivant :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <dir.h>
  5. #include<dirent.h>
  6. void chercher (char* nomfichier, FILE *f2)
  7. {
  8. FILE *f; // Pointeur vers fichier f  
  9. char information[3000]; // Chaine de 3000 caractères au max  
  10. char *pos; // Chaine de caractère représentant le pointeur  
  11. char donnee [3000]; // Chaine de 3000 caractères au max  
  12. char info[3000]; //Chaine de 3000 caractères au max  
  13. f=fopen(nomfichier, "r" ); //OUverture du fichier texte comme celui ci-dessus en lecture  
  14. while (!feof(f)) //Tant qu'on est pas à la fin du fichier faire  
  15. {
  16.   fgets(information, 256, f); /* Récupération de la ligne et stockage dans information*/
  17.   pos=strstr(information, ": " ); /*strstr renvoie la valeur du pointeur se trouve  la première ocurence des ":_" et stockage dans pos */
  18.   printf("%s",pos) ;
  19.   if (pos != NULL) //Si la valeur du pointeur n'est pas nulle...
  20. {
  21.      pos++; // Incrémentation de pos  
  22.      pos++ ; // On enlève le blanc suivant les ":" aussi  
  23.      fprintf(f2, "%s", pos); // Ecriture de la chaine dans le fichier texte crée  
  24. }
  25. }
  26.   fclose(f); //On ferme le fichier f
  27. }
  28. int main()
  29. {
  30. FILE *f; //Pointeur sur fichier f
  31. FILE *f2; //Pointeur sur fichier f2
  32. int l;
  33. char nomfichier[256];
  34. printf("Bienvenue dans le programme de tri des fiches de stage\n" );
  35. system("dir *.txt /b  > res.txt" ); // Liste toutes les fiches de stage dans res.txt
  36. f=fopen("res.txt","r" ); ///OUvre ce fichier
  37. system(" echo. > fiche.txt" ); //Création d'un fichier texte vide  
  38. f2=fopen("fiche.txt", "w" ); //Ouverture de ce fichier texte en écriture  
  39. while (!feof(f)) //Tant qu'on est pas à la fin de ce fichier
  40. {
  41.   printf(".\n" ); 
  42.   fgets( nomfichier, 256, f ) ;  //Récupération d'un nom de fiche de stage
  43.   l=strlen(nomfichier); //Affectation de la longueur de ce nom à l
  44.   nomfichier[l-1]='\0'; //On remplace le /n par /0
  45.   if(nomfichier!=NULL)//Si il n'y a pas d'erreur lors de l'ouverture du fichier...
  46.   {
  47.    chercher(nomfichier, f2); //Appel à la fonction chercher
  48.   }
  49.   else
  50.   {
  51. printf("une erreur est survenue pendant l'execution\n" );
  52.   }
  53. }
  54.   fclose(f); //Fermeture du fichier f
  55.   return 0; //Fin du programme
  56. }


 
Cependant lorsque je compile ce programme sous dev C++ ou sous turbo C, il ne me met aucune erreur ni warning mais lorsque je lance l'éxécutable, le programme plante ou sous turbo C quand je fais run, ça me donne une sorte de boulce infinie avec que des <NULL> à l'écran...
Si quelqu'un pouvait me dire où j'ai fait l'erreur, ça serait sympa...
 :)

Reply

Marsh Posté le 18-04-2006 à 19:49:41   

Reply

Marsh Posté le 18-04-2006 à 20:40:24    

Code :
  1. system(" echo. > fiche.txt" );


 
pas necessaire, regardes la doc de fopen
 

Code :
  1. while (!feof(f))


 
regardes la doc de feof
 

Code :
  1. nomfichier[l-1]='\0'; //On remplace le /n par /0


 
pas forcement, regardes la doc de fgets
 

Code :
  1. if(nomfichier!=NULL)


 
faute de frappe ? ce test est toujours vrai
 

Code :
  1. fclose(f); //Fermeture du fichier f


 
faudrais aussi fermer f2 et faire plus de controle sur les e/s
 

Code :
  1. printf("%s",pos) ;
  2. if (pos != NULL)


 
le printf devrait etre dans le if sinon ca plante si pos est nul

Reply

Marsh Posté le 18-04-2006 à 21:32:32    

Joker28 a écrit :


Cependant lorsque je compile ce programme sous dev C++ ou sous turbo C, il ne me met aucune erreur ni warning mais lorsque je lance l'éxécutable, le programme plante ou sous turbo C quand je fais run, ça me donne une sorte de boulce infinie avec que des <NULL> à l'écran...
Si quelqu'un pouvait me dire où j'ai fait l'erreur, ça serait sympa...
 :)


 

  • fopen() peut échouer
  • feof() ne fait pas ce que tu crois. Il faut tester le retour des fonctions de lecture.
  • Un fichier ouvert en "w" est automatiquement créé sii il n'existe pas.
  • f2 n'est pas fermé.
  • La trace 'printf("%s", pos)' doit être mise après le test de pos...


A la vache, grillaid à 100% !
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define DBG 0
  5. static void clean (char *s, FILE *fp)
  6. {
  7.    /* search ... */
  8.    char *p = strchr (s, '\n');
  9.    if (p != NULL)
  10.    {
  11.       /* ... and kill */
  12.       *p = 0;
  13.    }
  14.    else
  15.    {
  16.       /* purge */
  17.       int c;
  18.       while ((c = fgetc(fp)) != '\n' && c != EOF)
  19.       {
  20.       }
  21.    }
  22. }
  23. static void chercher (char* nomfichier, FILE *f2)
  24. {
  25.    FILE *f = fopen(nomfichier, "r" );
  26.    if (f != NULL)
  27.    {
  28.    char information[256];
  29.    while (fgets(information, sizeof information, f) != NULL)
  30.    {
  31.       /* strstr() renvoie la valeur du pointeur qui se trouve
  32.          a la première ocurence des ":_" et stockage dans pos */
  33.       char *pos = strstr(information, ": " );
  34.       if (pos != NULL) //Si la valeur du pointeur n'est pas nulle...
  35.       {
  36. #if DBG
  37.       printf("%s", pos) ;
  38. #endif
  39.          /* +2 : On saute ": " */
  40.          /* Ecriture de la chaine dans le fichier texte cree */
  41.          fprintf(f2, "%s", pos + 2);
  42.       }
  43.    }
  44.       fclose (f), f = NULL;
  45.    }
  46.    else
  47.    {
  48.       perror(nomfichier);
  49.    }
  50. }
  51. int main(void)
  52. {
  53.    printf("Bienvenue dans le programme de tri des fiches de stage\n" );
  54.    /* Liste toutes les fiches de stage dans res.txt */
  55.    system("dir *.txt /b  > res.txt" );
  56.    {
  57.       /* OUvre ce fichier */
  58.       char const fres[] = "res.txt";
  59. #define  FICHE "fiche.txt"
  60.       FILE *f = fopen(fres, "r" );
  61.       if (f != NULL)
  62.       {
  63.          FILE *fw = fopen(FICHE, "w" );
  64.          if (fw != NULL)
  65.          {
  66.             char nomfichier[256];
  67.             while (fgets( nomfichier, sizeof nomfichier, f ) != NULL)
  68.             {
  69.                clean(nomfichier, f);
  70.                chercher(nomfichier, fw);
  71.             }
  72.             fclose(fw), fw = NULL;
  73. #if 1
  74.             system ("type "FICHE);
  75. #endif
  76.          }
  77.          else
  78.          {
  79.             perror(FICHE);
  80.          }
  81.          fclose(f), f = NULL;
  82.       }
  83.       else
  84.       {
  85.          perror("res.txt" );
  86.       }
  87.    }
  88.    return 0;
  89. }


Message édité par Emmanuel Delahaye le 19-04-2006 à 11:19:43

---------------
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 19-04-2006 à 08:41:15    

Merci beaucoup les gars, j'vais étudié tout ça de plus près!

Reply

Sujets relatifs:

Leave a Replay

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