Se connecter / S'enregistrer
Votre question

ce programme pourriez vous le vérifier ?

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
8 Septembre 2007 18:39:59

salut ,

j'ai écrit un prog en C , la compilation n'affiche aucune erreur , par contre l'exécution donne Erreur de segmentation .. si qq pourra le vérifier pour savoir où est la faute ... je vous remercie d'avance :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "structure.h"
  5.  
  6.  
  7. void Lecturefichier ( FILE *f , Module t[]);
  8. void Ecriturefichier ( Module t[]);
  9.  
  10.  
  11.  
  12.  
  13. int main ()
  14. {
  15. Module exemple[LenM]; FILE *f;
  16. f = fopen ("donnees.csv ", "r");
  17. Lecturefichier (f,exemple);
  18. fclose (f);
  19. Ecriturefichier(exemple);
  20. return 1;
  21. }
  22.  
  23.  
  24.  
  25. void Lecturefichier ( FILE *f , Module t[])
  26. {
  27. char *pointeur;
  28. char *buffer;
  29. char ch[80];
  30. char chaine[1000];
  31. char *separateur = {";"};
  32. int i = 1;
  33. int valeur ;
  34. int j = 1;
  35. t[1].Mod ="AP11";
  36.  
  37. while ((fgets (chaine,1000,f)) != NULL )
  38. {
  39. fgets (ch,80,f);
  40. buffer = strdup (ch);
  41. pointeur = strtok(buffer,separateur);
  42.  
  43. if ( (strcmp (pointeur,t[i].Mod ))== 0 )
  44. {
  45. t[i].Mod = pointeur ;
  46. pointeur = strtok (NULL , separateur);
  47. t[i].Sem = pointeur ;
  48. pointeur = strtok (NULL , separateur);
  49. t[i].Prom = pointeur ;
  50. pointeur = strtok (NULL , separateur);
  51. t[i].Cord = pointeur ;
  52. pointeur = strtok (NULL , separateur);
  53. t[i].act[j].Nom = pointeur ;
  54. pointeur = strtok (NULL , separateur);
  55. sscanf(pointeur,"%d",&valeur);
  56. t[i].act[j].Ng = valeur ;
  57. pointeur = strtok (NULL , separateur);
  58. sscanf (pointeur ,"%d", &valeur);
  59. t[i].act[j].Neg = valeur;
  60. pointeur = strtok (NULL , separateur);
  61. sscanf (pointeur,"%d", &valeur);
  62. t[i].act[j].Nhg = valeur;
  63. j++;
  64. }
  65. if ((strcmp (pointeur, t[i].Mod)) != 0 )
  66. {
  67. i++;
  68. t[i].Mod = pointeur ;
  69. pointeur = strtok (NULL , separateur);
  70. t[i].Sem = pointeur ;
  71. pointeur = strtok (NULL , separateur);
  72. t[i].Prom = pointeur ;
  73. pointeur = strtok (NULL , separateur);
  74. t[i].Cord = pointeur ;
  75. pointeur = strtok (NULL , separateur);
  76. t[i].act[j].Nom = pointeur ;
  77. pointeur = strtok (NULL , separateur);
  78. sscanf(pointeur,"%d",&valeur);
  79. t[i].act[j].Ng = valeur ;
  80. pointeur = strtok (NULL , separateur);
  81. sscanf (pointeur ,"%d", &valeur);
  82. t[i].act[j].Neg = valeur;
  83. pointeur = strtok (NULL , separateur);
  84. sscanf (pointeur,"%d", &valeur);
  85. t[i].act[j].Nhg = valeur;
  86. }
  87. }
  88. }
  89.  
  90.  
  91.  
  92.  
  93.  
  94. void Ecriturefichier ( Module t[] )
  95. {
  96. char nomfich[21];
  97. int i,j;
  98. FILE *sortie;
  99.  
  100. printf ( "nom du fichier à créer : ");
  101. scanf ( "%20s" , nomfich);
  102. sortie = fopen (nomfich , "w" );
  103.  
  104. for ( i=1;i<LenM;i++)
  105. {
  106. for ( j=1;j<LenA;j++)
  107. {
  108. fputs (t[i].Mod , sortie ); fputc (';',sortie);
  109. fputs (t[i].Sem , sortie ); fputc (';',sortie);
  110. fputs (t[i].Prom, sortie ); fputc (';',sortie);
  111. fputs (t[i].Cord, sortie ); fputc (';',sortie);
  112. fputs (t[i].act[j].Nom, sortie ); fputc (';',sortie);
  113. putw (t[i].act[j].Ng , sortie ); fputc (';',sortie);
  114. putw (t[i].act[j].Neg, sortie ); fputc (';',sortie);
  115. putw (t[i].act[j].Nhg, sortie ); fputc (';',sortie);
  116. }
  117. }
  118. fclose (sortie);
  119. }

pour structure.h voilà le code :
  1. # define LenA 10
  2.  
  3. # define LenM 50
  4.  
  5. FILE *f;
  6.  
  7. typedef struct { char *Nom;
  8. int Ng, Neg, Nhg; } Activite ;
  9.  
  10. typedef struct { char *Mod, *Sem, *Prom, *Cord;
  11. Activite act[LenA]; } Module ;
  12.  
  13.  
  14. void Lecturefichier ( FILE *f , Module t[]);
  15.  
  16. void Ecrirefichier ( Module t[]);

donnees.csv est un fichier csv de cette forme :
"qsds";"sfsdf";"hjj";"hsdfh";1;5;5;
"gdfhjg";"sd";"dkfns";"dksk";2;5;5
...ainsi de suite


pour l'erreur : mon fichier que j'utlilise est forme de LenM = 2 et LenA = 4 . est ce que cela peut etre la cause ?

Autres pages sur : programme pourriez verifier

8 Septembre 2007 22:48:47

toujours vérifier les retours de fonctions!
en l'occurence, tu a un espace en trop dans le nom du fichier, tu aurais vérifié le retour de "fopen", ca t'aurait économisé une prise de tête :p 
21 Septembre 2007 12:54:44

J'ai un problème avec strtok_r,
par exemple, si j'ai ce buffer :
monday tuesday

ptr=strtok_r(buffer," ",str_ptr );
affiche monday
et puis pour recupere la seconde chaine de caractère
ptr=strtok_r(*str_ptr," ",str_ptr );
affche NULL
21 Septembre 2007 13:26:47

  1. char *ptr;
  2. char buffer[]="monday tuesday";
  3. ptr=strtok (buffer, " ");
  4. while (ptr != NULL)
  5. {
  6. printf ("%s\n", ptr);
  7. ptr = strtok (NULL, " ");
  8. }
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS