[ C ] probleme affichage (agenda)

salut a tous!

bon je dois faire un agenda en C mais j’ai un probleme au niveau d’un module affichage

mon probleme est le suivant :

quand je rentre des personne dans mon programme il les ecrit sur un fichier et me les retourne quand je lui demande …
le progble vien que quand je lui demande de m’afficher tout les contact de mon fichier il lit tout le fichier et “print” toute les personnes MAIS ! la derniere personne que j’ai rentré il me la donne 2 fois…

je vous met le code ( c’est assé gros dsl)

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

// #### STRUCTURE ####

typedef struct
{
char nom[50];
char prenom[50];
char age[50];
char adresse[50];
char mas[50];
char codep[50];
char tel[50];

}personne;

personne contact;
FILE *fic_contacts;

// ### FONCTION AFFICHER!!! ###

void afficher()
{
int choix;

   fic_contacts = fopen("c:\\contacts.txt","r");
   printf("\n");
   system("cls");
   printf(" # Vous desirez afficher # \n\n");
   printf(" 1 - Tout les contacts\n");
   printf(" 2 - Une personne en particulier\n");
   
   printf(" choix : ");
   scanf("%d",&amp;choix);
   
  
            
   if (choix == 1)
   { 
   // ouverture du fichier en lecture
    if((fic_contacts=fopen("c:\\contacts.txt","r"))==NULL)
    { 
    printf("personne dans vos contact, appuyer sur une touche...");
    getch();
    main(); 
    }
    
    fic_contacts = fopen("c:\\contacts.txt","r");
   
    
     
    
    while (!feof(fic_contacts))
    {      
    fread(&amp;contact,sizeof(contact),1,fic_contacts);
    
    printf("\t\20Nom : %s\n", contact.nom);
    printf("\t\20Prenom : %s\n", contact.prenom);
    printf("\t\20Adresse : %s\n", contact.adresse);
    printf("\t\20Ville : %s\n", contact.mas);
    printf("\t\20Code Postal : %s\n", contact.codep);
    printf("\t\20Telephone Fixe : %s\n", contact.tel);
    printf("\n\n");
    }
    
    printf("appuyer sur une touche pour retourner au menu");
    getch();
    printf("\n\n\n");
    main();
    fclose(fic_contacts);
    }
    
  
   
   
   if (choix == 2)
     {      
             
             if((fic_contacts=fopen("c:\\contacts.txt","r"))==NULL)
             { 
             printf("personne dans vos contact, appuyer sur une touche...");
             getch();
             main(); 
             }
             
             char name[30];
             char pren[30];
             
             FILE *fic_contacts ;
            
             
             
             printf("\n"); 
             printf("Rentrer le NOM  : ");
             scanf("%s",name);
             printf("\n");
             printf("Rentrer le prenom: ");
             scanf("%s",pren);
             
             fic_contacts = fopen("c:\\contacts.txt","r"); // ouverture du fichier
             // compare les listes de caracteres rentré et presente sur le fichier contact.txt
             
             while ( !feof(fic_contacts) )
             {  
             fread(&amp;contact,sizeof(contact),1,fic_contacts);
             
             
             if(strcmp(name,contact.nom)== 0 &amp;&amp; strcmp(pren,contact.prenom)== 0 )
             {
             printf("\n");                                   
             printf(" Voici Les contacts enregistres dans votre AGENDA\n\n");
             printf("\t\20Nom : %s", contact.nom);
             printf("\n");
             printf("\t\20Prenom : %s", contact.prenom);
             printf("\n");
             printf("\t\20Adresse : %s", contact.adresse);
             printf("\n");
             printf("\t\20Ville : %s", contact.mas);
             printf("\n");
             printf("\t\20Code Postal : %s", contact.codep);
             printf("\n");
             printf("\t\20Telephone Fixe : %s", contact.tel);
             printf("\n\n");
             printf("appuyer sur une touche pour revenir au menu");
             getch();
             main();
             }
             }
             if(strcmp(name,contact.nom)!= 0 &amp;&amp; strcmp(pren,contact.prenom)!= 0  )
             {  
              printf("\n");  
              printf("La personne ne se trouve pas dans votre agenda\n");
              printf("appuyer sur une touche pour revenir au menu\n");
              getch();
              main();
              }
             
      
      
      }

}

si quelqun peu m’aider ou me mettre sur le vois…
merci

while (!feof(fic_contacts))
{
–> fread(&contact,sizeof(contact),1,fic_contacts);
|

Regarde combien d’octet fread a lu, si < sizeof(contact), pas d’affichage.

comment je vois stp? ( je debute )

je je tape printf("%d",sizeof(contact)); il me dit 350

la fonction fread te renvoie le nb d’octets lus

variable=fread(…);
if(variable<sizeof(contact))
{
//pas d’affichage
}
else …

mais si variable<sizeof(contact) alors quand je lui demanderais mes contact il ne me les affichera pas?

quand tu récupères un contact valide, variable=sizeof(contact), mais si tu récupères autre chose (par ex un espace ou autre chose à la fin du fichier) ce sera inférieur

donc dans mon code tu ferais quoi pour mon probleme ? stp

tu déclares un entier “taille_lue” en haut de ton fichier et ensuite

[cpp] if (choix == 1)
{
// ouverture du fichier en lecture
if((fic_contacts=fopen(“c:\contacts.txt”,“r”))==NULL)
{
printf(“personne dans vos contact, appuyer sur une touche…”);
getch();
main();
}

    fic_contacts = fopen("c:\\contacts.txt","r");
   
     
    /*code modifié*/ 
     
    while (!feof(fic_contacts))
    {      
    taille_lue=fread(&amp;contact,sizeof(contact),1,fic_contacts);

    if(taille_lue < sizeof(contact));
    else
       { 
        printf("\t\20Nom : %s\n", contact.nom);
        printf("\t\20Prenom : %s\n", contact.prenom);
        printf("\t\20Adresse : %s\n", contact.adresse);
        printf("\t\20Ville : %s\n", contact.mas);
        printf("\t\20Code Postal : %s\n", contact.codep);
        printf("\t\20Telephone Fixe : %s\n", contact.tel);
        printf("\n\n");
        }
    }
    /*fin code modifié*/

    printf("appuyer sur une touche pour retourner au menu");
    getch();
    printf("\n\n\n");
    main();
    fclose(fic_contacts);
    } [/cpp]

pas testé mais ça devrait fonctionner [:austindangerpowers]

je comprend mieu avec du code :confused:

merci je test ca et je te met au courant

taille_lue est un evariable de quel type? car qaudn je l’integre en int il ne m’affiche rien

plezz

fait un: printf(“taille lue= %d\n”,taille_lue);
avant le if

ça t’affiche quoi ?

et tente avec un double pour le type de taille_lue

ca rentre pas dans le if :confused: dans le else c’est 0 et avec un double c’est tjrs pasreil?

tu as bien mis le printf de taille_lue avant le if et ça t’affiche 0 à chaque tour de boucle ?

en faite avant le if il me dit taille_lue = 0

ouai je m’etait trompé au debut … mais c’est tjrs pareil il me marque 3 fois taille_lue=0
taille_lue=0
taille_lue=0

mais si tu veux la source est sur mon ftp c’est “projeTecole”
sur antoine.gaiffe.free.fr