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!
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
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!
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!