RECHERCHER :
COMMUNAUTE MP
Identifiez vous ...
Devenir Membre
J'ai oublié mon MDP
DOMAINE MP
Bavardages
Langages Généraux
Langages Web
Langages DotNet
Autres langages
Dev. Jeux Video
Sécurité
Sys. Exploitation
Graphismes
Logiciels
Réseaux
Bases de données
Méthodologies
Emplois High-tech
Aide juridique
Articles juridiques
FORUM
Index des forums
Ajouter un sujet
Rechercher sujet
Contact Responsable
Devenir modérateur
CHAT MP IRC
Votre pseudo ...
Serv: irc.irc-land.org
Chan: #MoteurProg
PARTICIPER
Plus de 3500 emplois.
Rechercher un job
Déposez votre CV
Emplois High-tech

Visiteur MP

 problème à l'écriture d'un fichier

Forum : C - CONSOLE
Sous Catégorie : Console
Type du sujet : Sujet Normale
FAQ : FAQ C - CONSOLE

SUIVI DES SUJETS PAR MAIL

SUIVI PAR MAIL INACTIF

RESOLUTION DU SUJET SUJET NON RESOLU
BLOQUAGE DU SUJET SUJET ACTIF
APPARTENANCE A LA FAQ N'APPARTIENT PAS A LA FAQ


PAGE : [1]

POSTER UN NOUVEAU SUJET REPONDRE A CE SUJET

FORUM C - CONSOLE

PREMIERE PAGE

PAGE PRECEDENTE

Page précedente

Page suivante

PAGE SUIVANTE

DERNIERE PAGE
Bornerdogge
Membre actif
Inscrit : 06/04/2006
Messages : 133
Message
#106553
Posté le 01/08/06 à 18:41
salut!
quand la fonction ouv() se lance, le programme bogue.
je ne sais pas ce qu'il y a.
j'ai mis tout le code car je ne sais pas comment expliquer clairement le problème.

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> struct annuaire{ char *nom; char *prenom; char *tel; char *email; }; void menu(void), nouv(void), vision(void); void enreg(void), ouv(void); void sleep(int nbr_seconds); struct annuaire annuaire_01[100]; struct annuaire *ptr=annuaire_01; int count=0; unsigned char eai=130; main(){ ouv(); menu(); system("pause"); return 0; } void menu(void){ int choix; do{ printf("Entrez:\n"); printf("1..........pour entrer une nouvelle occurence\n"); printf("2..........pour visionner la liste et pour enregistrer \n\t\t\tautomatiquement les entr%ces\n", eai); printf("3..........pour quitter\n"); scanf("%d", &choix); printf("\n"); }while(choix<1 || choix>3); switch(choix){ case 1: { nouv(); break; } case 2: { vision(); break; } case 3: { exit(0); } } } void nouv(void){ fflush(stdin); printf("\nEntrez le nom de la personne!\n"); if( (((ptr+count)-> nom) = (char*) malloc(sizeof(char)*15)) == NULL) printf("Erreur de l'allocation de m%cmoire pour le nom de la personne!", eai); gets((ptr+count) -> nom); printf("\nEntrez le pr%cnom de la personne!\n", eai); if( (((ptr+count)-> prenom) = (char*) malloc(sizeof(char)*15)) == NULL) printf("Erreur de l'allocation de m%cmoire pour le pr%cnom de la personne!", eai, eai); gets((ptr+count) -> prenom); printf("\nEntrez l'adresse E-Mail de la personne!\n"); if( (((ptr+count)-> email) = (char*) malloc(sizeof(char)*25)) == NULL) printf("Erreur de l'allocation de m%cmoire pour l'adresse E-Mail de la personne!", eai); gets((ptr+count) -> email); printf("\nEntrez le num%cro de t%cl%cphone de la personne!\n", eai, eai, eai); if( (((ptr+count)-> tel) = (char*) malloc(sizeof(char)*15)) == NULL) printf("Erreur de l'allocation de m%cmoire pour le num%cro de t%cl%cphone de la personne!", eai, eai, eai, eai); gets((ptr+count) -> tel); printf("\n"); count++; menu(); } void vision(void){ int count2, count3; enreg(); for(count2=0; count2<count; count2++){ printf("%d ", count2+1); printf(" %s", (ptr+count2)->nom); printf("%s", (ptr+count2)->prenom); printf("%s", (ptr+count2)->email); printf("%s", (ptr+count2)->tel); } puts(""); menu(); } void ouv(void){ FILE *fp; if((fp=fopen("annuaire.txt", "r"))==NULL){ printf("\nErreur a l'ouverture du fichier en mode lecture."); sleep(1); exit(1); } for(count=0; ; count++){ fscanf(fp, "%[^ ]%[^ ]%[^ ]%s", (ptr+count)->nom, (ptr+count)->prenom, (ptr+count)->email, (ptr+count)->tel); if(annuaire_01[count].nom==0 && annuaire_01[count].prenom==0 && annuaire_01[count].email==0 && annuaire_01[count].tel==0){ break; } } fclose(fp); } void enreg(void){ int count2; FILE *fp; if((fp=fopen("annuaire.txt", "w"))==NULL){ printf("\nErreur a l'ouverture du fichier en mode %ccriture.", eai); sleep(1); exit(1); } for(count2=0; count2<count; count2++){ fprintf(fp, "%s %s %s %s\n", annuaire_01[count2].nom, annuaire_01[count2].prenom, annuaire_01[count2].email, annuaire_01[count2].tel); } fclose(fp); } void sleep(int nbr_secondes) { clock_t goal; goal = (nbr_secondes * CLOCKS_PER_SEC ) + clock(); while(goal>clock()) { ; } }

__________________________
Ne jamais faire le jour même ce que l'on peut ne pas devoir faire le lendemain!

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Publicité
Inscrit : X
Messages : X
Message
#Aucun

HAUT DE PAGE

  

Spirit
Superviseur :
- C & C++
Modérateur :
- PHP
- Javascript
- MySQL
Avatar de Spirit
Inscrit : 07/04/2004
Messages : 1948
Message
#106572
Posté le 02/08/06 à 01:49
for(count=0; ; count++)

pas cool la boucle infinie...

si le programme bug à l'appel de ouv(), le code de ouv suffit et pas tout ton programme...
__________________________
Spirit - modérateur casu ^-^'

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Molo
Membre du club
Avatar de Molo
Inscrit : 21/12/2005
Messages : 367
Message
#106593
Posté le 02/08/06 à 11:13
Salut,
Effectivement, l'erreur vient de ouv().
Quand j'execute ton prog avec un "annuaire.txt" vide, y'a pas de bug, mais si y'a le moindre caractère dans le fichier, ça plante, explication avec code simplifiée:


for(count=0; ; count++){ /*Si le fichier est vide, y'a rien à mettre dans (ptr+count)->nom, pas de tentative d'ecriture, dans le cas contraire le prog essaie d'ecrire sur un (ptr+count)->nom dont aucun espace mémoire ne lui été réservé(char* nom), ce qui le plante, tu devrais mettre directe dans ta structure annuaire(char nom[30]) ou mettre avant le fscanf un (nom=(char*)malloc(sizeof(char)*30)*/ fscanf(fp, "%s", (ptr+count)->nom); }

Avec cette rectification, ton code est correctement executé, autre chose, ta logique de choix menu n'est pas bonne(Menu()->Nouv()->Menu()->Nouv()), c'est l'horreur quoi au niveau pile du programme:


void Menu() { /*...Traitement*/ Nouv(); /*Tu fais appel à Nouv() et Nouv() refait appel à Menu() et ainsi de suite dans ta boucle...*/ /*...Traitement*/ } void Nouv() { /*...Traitement*/ Menu(); }


Lol, faudrait que tu retravailles la question.
__________________________
L'une des fonctions principales d'un ami consiste à subir, sous une forme plus douce et symbolique, les châtiments que nous désirerions, sans le pouvoir, infliger à nos ennemis.
Aldous Huxley
Le meilleur des mondes

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Bornerdogge
Membre actif
Inscrit : 06/04/2006
Messages : 133
Message
#106606
Posté le 02/08/06 à 14:20
bon maintenant ça fonctionne (avec malloc()), mais je ne sais pas comment controler la sortie de la boucle for!
__________________________
Ne jamais faire le jour même ce que l'on peut ne pas devoir faire le lendemain!

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Agahaz
Superviseur :
- Réseaux
Modérateur :
- XP / 2000 / .
- Xhtml/Css
- Visual basic
Avatar de Agahaz
Inscrit : 23/06/2005
Messages : 763
Message
#106627
Posté le 02/08/06 à 18:39
Aulieu de faire une boucle infinie tu ferais mieux faire un while qui teste la fin du fichier

while(!feof(fp)) { // lecture du fichier... }


Smiley
__________________________
FAQ Réseau
N'oubliez pas le tag [Résolu]Image (en haut à droite du titre du sujet)
Site perso sur les éoliennes et la programmation
Radio métal

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE ALLER VOIR SON SITE

Bornerdogge
Membre actif
Inscrit : 06/04/2006
Messages : 133
Message
#106634
Posté le 02/08/06 à 20:47
bonne idée...
mais comme ça il s'arrete une ligne trop loin!
__________________________
Ne jamais faire le jour même ce que l'on peut ne pas devoir faire le lendemain!

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 
POSTER UN NOUVEAU SUJET REPONDRE A CE SUJET

PREMIERE PAGE

PAGE PRECEDENTE Page précédente

Page suivante

PAGE SUIVANTE DERNIERE PAGE

FORUM C - CONSOLE



    PAGE : [1]



.: Site Web développé par Julien Pichot et l'équipe MPWG avec www.evolvia-web.com :.