Problème écriture dans un fichier en language C
Forum Programmation : Problème écriture dans un fichier en language C
Bonjours à tous,
Code :
|
Code :
|
dans le main(), sa ce présente comme ça:
Code :
|
Donc voila mon problème que je rencontre avec ces deux fonction, je saisie des information que je veux ensuite enregistrer dans le fichier annuaire.txt, seulement sa ne fonctionne que si il n'y a rien dans le fichier, si j'ai déjà saisie des info avant, windows me met un message d'erreur du genre:
"Annuaire.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru."
Je pense que le problème vient de fait que j'utilise deux fois d'affillé FILE* fichier, fichier = fopen(....). Mais je n'arrive pas a comprendre pourquoi.
Qu'es ce que vous en pensez?
Merci d'avance pour vos réponse
Message édité par seb326 le 11-04-2008 à 18:43:15
C'est ton programme qui crash.
Le FILE * ne pose pas de problème, d'autant que tu fermes bien le fichier.
Ton problème vient d'ailleurs. Lorsque tu enregistres en fin de fichier, as-tu déjà chargé des données ?
Sinon, passe en debug pour savoir où ça plante exactement.
Probablement un pointeur qui, quelque part, n'est pas NULL, ce qui donne un pointeur invalide sur la mémoire hors de ton processus.
Message édité par CRicky le 11-04-2008 à 20:36:05
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Merci d'avoir répondu aussi rapidement, je vais voir dans ce sens.
A oui j'ai oublié de précisais que lorsque je retire le FILE *fichier et le fichier = fopen(...) enfin tous ce qui permet de lire le fichier dans la fonction saisie et bien sa fonctionne très bien, c'est pour sa que je pensais que ça venais de la.
Non, c'est lorsque tu lis le fichier, tu ne remplis pas correctement tous les champs.
Est-ce que tous chaines sont correctement taillées (que ce soit statiquement ou dynamiquement), en prenant bien en compte le '\0' terminal de toute chaine de caractères. Si tu as des liens (comme pour les listes chainées), pour touts les liens non utilisés, force-les bien à 0.
Lorsque tu prends le contenu d'un pointeur, vérifie bien que tu fais un test de pointeur non nul.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Désolé mais je n'ai pas tout compris. Oui toute mes chaine de caractère sont bien taillé j'ai fait attention mais qu'es ce que tu entend par statiquement et dynamiquement? Et finissent bien par \0.
En débugant, j'ai trouvé le problème mais je sais pas comment le résoudre!
le problème vient de la:
1. for (i = 0; i < NbreClients; i++)
2. {
3. SaisirClient(i);
4. }
5.
6. Enregistrement(NbreClients);
Par exemple, je rentre comme valeur 1 pour NbreClient (le code pour cette saisie n'est pas affiché), donc il fait la boucle for une fois puis passe a la fonction Enregistrement mais le problème c'est que lorsqu'il passe a cette fonction, NbreClient = 2293560 mais je sais pas pourquoi et donc après dans cette fonction il y a une boucle for qui dépend de NbreClient et donc il fait la boucle 2293560 fois. Quand je débug il me met un message: Une violation d'accès (erreur de segmentation) est apparue dans votre programme.
si tu pouvais faire un printf de NbreClients avant le for qui est dans Enregistrement.. parce que c'est louche
dans le for qui boucle tu modifies NbreClient ?
Message édité par Anonyme le 11-04-2008 à 23:34:04
Je pense qu'il le modifie indirectement en écrasant la pile par un buffer overflow en modifiant une variable globale.
seb326 tu ferai mieux de montrer tout ton code, parce que le problème peut être partout, et probablement à l'initialisation de tes structures.
Message édité par CRicky le 12-04-2008 à 07:57:57
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Je veux bien mettre tout mon code mais il fait 700 lignes!!
Cart: Non je modifie jamais NbreClient, d'ailleurs dans saisieClient NbreClient n'est pas utilisé.
Voici mon code, j'ai quand même retiré des fonctions car je pense pas que sa vient de celles ci puisqu'elle sont indépendantes des autres.
(fonctions retiré: Lister(), Modifier(Client *cellule), Supprimer(), Rechercher())
Merci d'avance pour ceux qui essayeront de comprendre mon code.
Code :
|
Message édité par seb326 le 12-04-2008 à 11:11:25
J'ai fait comme ma conseillé Cart de mettre des printf (j'ai saisie comme valeur pour NbreClient = 2 pour qu'il fasse la boucle deux fois), j'en ai mis un avant le for (il met la bonne valeur: 2), un dans le for avant l'appelle de la fonction SaisieClient, premier tour c bon il m'affiche 2, met le 2eme tour, il m'affiche 2293560. Donc le problème doit venir de la boucle enfin je sais pas, je comprend vraiment pas ce qui se passe!!
en effet c'est assez long, pour situer mieux le problème, affiches nbreClient après chaque while qui sont dans le for, numérotes les printf pour pouvoir les discerner
Ok je vais essayé, et merci encore de m'aider
J'ai essayé mais le problème vient d'avant la fonction enregistrer car NbreClients =2293560 avant la fonction enregistrer, mais le problème c'est que je n'utilise pas NbreClient dans les fonction d'avant donc normalement sa devrai pas changer!!
J'ai l'impression que sa vient du code suivant ce trouvant dans le début de la Fonction SaisieClient:
Code :
|
En effet, quand je met ce bout de code en commentaire, sa fonctionne!!
Mais je vois pas en quoi sa modifierai NbreClients.
| seb326 a écrit : J'ai essayé mais le problème vient d'avant la fonction enregistrer car NbreClients =2293560 avant la fonction enregistrer, mais le problème c'est que je n'utilise pas NbreClient dans les fonction d'avant donc normalement sa devrai pas changer!! |
C'est possible. En mémoire, les variables sont placées les unes après les autres. Si tu es sur une variable et que tu dépasses la taille, tu vas écrire sur une autre variable (sans savoir laquelle). C'est ce qui s'appelle le "buffer overflow".
Dans ton code, je vois que DIM_LISTE n'est utilisé que 2 fois : dans le #define et l'initialisation du tableau. ça veut donc dire, que tu ne fait aucun contrôle de dépassement de taille. Tu dois toujours faire des contrôles lorsque tu ajoutes quelque chose que ce soit un nouvel élément ou une chaine, pour justement éviter les buffers overflow.
Lorsque, comme je te l'avais suggéré, tu auras mis tous ces contrôles, tu remettras ton code, et je le lirai.
Ton programme n'est pas très complexe. Je pense, qu'en y ajoutant tous les contrôles, tu trouveras facilement le problème.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Il y a 831 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
