problème langage C besoin d'aide...

problème langage C besoin d'aide... - C - Programmation

Marsh Posté le 11-12-2005 à 21:56:15    

Bonjour à toutes et à tous,
Je suis actuellement en train de travailler sur un mini projet qui est de realiser un agenda en langage C.
Et j'ai besoin d'aide pour la fonction afficher?!
voici le source:
 
//mon fichier header.
//fichtel.h//
#ifndef __FICHTEL_H
#define __FICHTEL_H
#define NB 10
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
 
 
void creation(char *nomFich);
void affiche(char *nomFich);
 
typedef struct
{
 char nom[20];
   int tel;
}Personne;
 
#endif
 
 
//fonction creation: cette fonction crée le fichier dont le nom est passé en paramètre. Elle permet de saisir une suite de noms et de //numéro de téléphone. La saisie s'arréte si l'utilisateur frappe la touche Return.
 
/*creation.c*/
/*Entrées:char *nomFich:pointeur sur cune chaine de caractére*/
/*Sorties:*/
/*E/S:*/
/*Description:Permet la creation et la saisie du fichier*/
 
 
#include "fichtel.h"
 
void creation(char *nomFich)
{
 FILE *ptMem;
   Personne tab[NB];
   Personne pers;
   int i;
   char c;
 
   clrscr();
   printf("\n\t*** CREATION D'UN NOUVEAU FICHIER DE TRAVAIL: %s ***\n", nomFich);
   printf("\n\tATTENTION si ce fichier de travail existe deja \n" );
   printf("\til sera irremediablement efface!!\n" );
   printf("\tVoulez vous quand meme continuer (o/n)?" );
   c=getch();
   if (c=='n')
   {
    return;
   }
   if((ptMem = fopen(nomFich, "wt" ))== NULL)
   {
    printf("\tProblème lors de l'ouverture du fichier %s", nomFich);
      exit(-1);
   }
   else
   {
    do
      {
       for(i=0;i<NB;i++)
         {
            printf("\nEntrer le nom de la personne" );
            printf("(Taper return pour sortir) : " );
            gets(pers.nom);
            if (strlen(pers.nom)==0)
            {
             break;
            }
            printf("\nEntrer son numero de telephone " );
            printf("(Exemple de synthaxe: 0476XXXXXX): " );
            scanf("%d",&pers.tel);
            fflush(stdin);
            tab[i]=pers;
         }
         if (fwrite ( tab, sizeof(Personne),i, ptMem) !=i)
         {
            printf("Probleme lors de l'ecriture dans le fichier" );
            getch();
            return;
         }
         if (i<NB)
         {
            break;
         }
      }while(1);
      fclose(ptMem);
   }
}
 
 
//le main.
/*NomProjet:agenda.c*/
/*Emplacement:*/
/*Description:Application qui permet de gérer un agenda téléphonique*/
/*var:*/
 
 
#include "fichtel.h"
 
 
void main (void)
{
   char nomFichier[12];
   char c;
 
   clrscr();
   printf("\n\n\t\t****** AGENDA TELEPHONIQUE ****** " );
   printf("\n\t Qu'elle est le nom de votre fichier de travail?\n" );
   printf("\t \n\n=>" );
   gets(nomFichier);
   do
   {
      clrscr();
      printf("\n\n\t\t\t*****MENU*****\n" );
      printf("\t\t A: Creation et saisie du fichier\n" );
      printf("\t\t D: Affichage du contenu du fichier\n" );
      printf("\t\t Q: quitter\n\n" );
      printf("\n\t\t Veuillez entrez votre choix\n\t\t\t=>" );
      c=getch();
      fflush(stdin);
 
      switch (c)
      {
       case 'a':
        case 'A':creation(nomFichier);
            break;
        case 'd':
        case 'D':affiche(nomFichier);
            break;
        default: printf("\t\tValeur erronee\n \t\tTaper une touche pour continuer\n" );
      }//fin du switch
      getch();
      fflush(stdin);
   }while(1);
}
 
 
//et ma fonction affiche que je n'arrive pas à faire fonctionné aidez moi svp...
 
#include "fichtel.h"
 
void affiche(char *nomFich)
{
   FILE *ptMem;
   Personne pers;
   ptMem=fopen(nomFich,"r" );
   fread(&nom,sizeof(int),1,ptMem);
   printf("%s\n",pers.nom);
   fread(tel,sizeof(int),1,ptMem);
   printf("\t\t\t\t tel : %d\n",&tel);
}

Reply

Marsh Posté le 11-12-2005 à 21:56:15   

Reply

Marsh Posté le 11-12-2005 à 23:15:23    

enhancer38 a écrit :

Bonjour à toutes et à tous,
Je suis actuellement en train de travailler sur un mini projet qui est de realiser un agenda en langage C.
voici le source:


Merci de lire les regles du forum et d'utiliser les balises de formattage 'fixed' ou 'cpp'.
 
Beaucoup d'erreurs (conception, realisation...)
 
Ton code commenté et en partie corrigé. Pose des questions si tu ne comprends (après avoir lu attentivement les commentaires '-ed-' ) :


//le main.
/*NomProjet:agenda.c*/
/*Emplacement:*/
/*Description:Application qui permet de gérer un agenda téléphonique*/
/*var:*/
 
#include "fichtel.h"
 
/* -ed- ajoute avoir des entrees correctes. Le code se touve ici :
http://mapage.noos.fr/emdel/clib.htm
*/
#include "ed/inc/io.h"
 
/* -ed- ajoute pour tolower() */
#include <ctype.h>
 
/*
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
*/
 
/* -ed- main() retourne int.
void main (void)
*/
int main (void)
{
   /* -ed- pas de condition de sortie... Ajoute 'fin'*/
   int fin = 0;
   char nomFichier[12];
   char c;
 
   /* -ed- fonction inconnue et probablement inutile.
      clrscr();
   */
   printf("\n\n\t\t****** AGENDA TELEPHONIQUE ****** " );
   printf("\n\t Qu'elle est le nom de votre fichier de travail?\n" );
   printf("\t \n\n=>" );
   /* -ed- la ligne n'est pas terminee par un \n. Ajout de fflush (stdout).
 
   http://mapage.noos.fr/emdel/notes.htm#fflush_stdout
 
   */
   fflush (stdout);
 
   /* -ed- Fonction buggee. usage interdit.
      gets(nomFichier);
       
      pour des saisies correctes :  
       
   http://mapage.noos.fr/emdel/notes.htm#saisie
   http://mapage.noos.fr/emdel/notes.htm#fichiers
 
   remplace par du code sur.
   */
   get_s(nomFichier, sizeof nomFichier);
 
   do
   {
      /* -ed- fonction inconnue et probablement inutile.
         clrscr();
      */
      printf("\n\n\t\t\t*****MENU*****\n" );
      printf("\t\t A: Creation et saisie du fichier\n" );
      printf("\t\t D: Affichage du contenu du fichier\n" );
      printf("\t\t Q: quitter\n\n" );
      printf("\n\t\t Veuillez entrez votre choix\n\t\t\t=>" );
      fflush (stdout);
      /* -ed- fonction non standard.
            c=getch();
       */
      c = get_c();
 
      /* -ed-
      comportement indefini.  
      Le comportement de fflush() n'est spécifié par le langage C que pour les  
      flux sortants.
       
      Inutile, supprime.
       
            fflush(stdin);
       */
      /* -ed- simplification du codage. forcage en minuscule */
      switch (tolower (c))
      {
      case 'a':
         /* -ed- suppression
               case 'A':
         */
         creation(nomFichier);
         break;
      case 'd':
         /* -ed- suppression
         case 'D':
         */
         affiche(nomFichier);
         break;
         /* -ed ajoute traitement de 'q' pour quitter */
      case 'q':
         fin = 1;
         break;
 
      default:
         printf("\t\tValeur erronee\n \t\tTaper une touche pour continuer\n" );
         /* -ed- deplace */
         get_c();
      } //fin du switch
      /* -ed- mal place. remise en place avec codage portable.
            getch();
      */
 
      /* -ed- inutile, suppression
            fflush(stdin);
      */
   }
   /* -ed- pas de condition de sortie... Ajoute 'fin'
      while (1);
   */
   while (!fin);
 
   /* -ed- ajoute pour etre conforme a la definition de main() */
   return 0;
}


avec


//fichtel.h//
#ifndef __FICHTEL_H
#define __FICHTEL_H
 
#define NB 10
 
/* -ed-
les elements de ce fichier d'interface n'ont pas besoin de ces headers.  
Chaque fichier d'implementation doit inclure ce dont il a besoin. Point.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
*/
 
void creation(char *nomFich);
void affiche(char *nomFich);
 
typedef struct
{
   char nom[20];
   /* -ed-
      int tel;
       
      Mon numero commence pa un 0. Ce n'est certainement pas le bon choix de  
      donnees. Une chaine d'une trentaine de caracteres est certainement plus  
      adaptee...
      */
   char tel[32];
}
Personne;
 
#endif


 


 
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
#include "ed/inc/io.h"
 
//fonction creation: cette fonction crée le fichier dont le nom est passé en paramètre. Elle permet de saisir une suite de noms et de //numéro de téléphone. La saisie s'arréte si l'utilisateur frappe la touche Return.
 
/*creation.c*/
/*Entrées:char *nomFich:pointeur sur cune chaine de caractére*/
/*Sorties:*/
/*E/S:*/
/*Description:Permet la creation et la saisie du fichier*/
 
 
#include "fichtel.h"
 
void creation(char *nomFich)
{
   FILE *ptMem;
   Personne tab[NB];
   Personne pers;
   int i;
   char c;
 
   /* -ed- fonction inconnue et probablement inutile.
      clrscr();
   */
   printf("\n\t*** CREATION D'UN NOUVEAU FICHIER DE TRAVAIL: %s ***\n", nomFich);
   printf("\n\tATTENTION si ce fichier de travail existe deja \n" );
   printf("\til sera irremediablement efface!!\n" );
   /* -ed-
   ca, c'est un vrai probleme de conception.  
   Rappel, une ouverture en mode "a" (append) permet la creation ou  
   l'ajout en fin de fichier.  
   */
 
   printf("\tVoulez vous quand meme continuer (o/n)?" );
   fflush (stdout);
 
   c = get_c();
 
   if (c == 'n')
   {
      return ;
   }
   /* -ed-
      if ((ptMem = fopen(nomFich, "wt" )) == NULL)
 
   "wt" n'existe pas. C'est "w" pour ouvrir en mode texte.  
 
   NOTA : il est totalement inutile d'ouvrir le fichier avant d'avoir fait les saisies.
   */
 
   /* -ed-
     do
         {
   cette boucle 'blanche' est totalement inutile. Suppression.  
   */
   for (i = 0; i < NB; i++)
   {
      printf("\nEntrer le nom de la personne" );
      printf("(Taper return pour sortir) : " );
      fflush (stdout);
 
      get_s(pers.nom, sizeof pers.nom);
 
      /* -ed- manque le prototype */
      if (strlen(pers.nom) == 0)
      {
         break;
      }
      printf("\nEntrer son numero de telephone " );
      /* -ed- attention a l'orthographe...
                  printf("(Exemple de synthaxe: 0476XXXXXX): " );
      */
      printf("(Exemple de synthaxe: 0476XXXXXX): " );
      fflush (stdout);
 
      /* -ed-
                  scanf("%d", &pers.tel);
                  fflush(stdin);
       
      suite au changement de type, changement de saisie.
      */
      get_s(pers.tel, sizeof pers.tel);
 
      tab[i] = pers;
   }
 
   if ((ptMem = fopen(nomFich, "w" )) == NULL)
   {
      /* -ed-
        printf("\tProblème lors de l'ouverture du fichier %s", nomFich);
      Manque un '\n'. Il y a des methodes plus radicales pour triter ce genre d'erreur
 
      */
      perror(nomFich);
 
      /* -ed-
            exit( -1);
             
            -1 n'est pas une valeur portable pour exit().
      */
      exit(EXIT_FAILURE);
   }
   else
   {
      if (fwrite ( tab, sizeof(Personne), i, ptMem) != i)
      {
         printf("Probleme lors de l'ecriture dans le fichier\n" );
         get_c();
         return ;
      }
      /* -ed- suppression
               if (i < NB)
               {
                  break;
               }
            }
            while (1);
               */
 
      fclose(ptMem);
   }
}


 


//et ma fonction affiche que je n'arrive pas à faire fonctionné aidez moi svp...
 
#include "fichtel.h"
#include <stdio.h>
 
void affiche(char *nomFich)
{
   FILE *ptMem;
   Personne pers;
   ptMem = fopen(nomFich, "r" );
   /* -ed- fopen() peut echouer. Manque un test */
 
   if (ptMem != NULL)
   {
      /* -ed- nom n'est pas defini.
         fread(&nom,sizeof(int),1,ptMem);
      */
      int ret = fread (&pers.nom, sizeof pers, 1, ptMem);
 
      if (ret == 1)
      {
         printf("%s\n", pers.nom);
         printf("%s\n", pers.tel);
      }
      /* -ed- tel n'est pas defini.
         fread(tel,sizeof(int),1,ptMem);
         printf("\t\t\t\t tel : %d\n",&tel);
      */
      /* -ed- manque la fermeture du fichier */
      fclose (ptMem), ptMem = NULL;
   }
}


Message édité par Emmanuel Delahaye le 13-12-2005 à 09:11:12

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 13-12-2005 à 06:30:41    

Merci beacoup a toi pour ta reponse...
J'ai enfin reuissi à faire marché cette affichage maintenant je suis en train de faire une fonction ajout pour pouvoir ajouter des noms et numeros de téléphone au fichier. Ma fonction à l'air de marcher puisque le programme la lance, je peu rentré des nom et numeros de telephone mais le problème et qu'il n'est ecris pas sur le fichier fevoici les sources.
Merci d'avance pour toute votre aide!

 
//le main
 
 
#include "fichtel.h"
 
void main (void)
{
 char nomFichier[12];
   char c;
 
   clrscr();
   printf("\t\t******-- AGENDA TELEPHONIQUE --****** " );
   printf("\n\t    Quel est le nom de votre fichier de travail?\n" );
   printf("\t       (Ancien fichier ou fichier a creer)\n\n\t=>" );
   gets(nomFichier);
   do {
     clrscr();
         printf("\n\n\t\t******FICHIER DE TRAVAIL: %s****", nomFichier);
         printf("\n\n\n\n\t\t\t\t****MENU****\n" );
         printf("\t\t A: -Creation et saisie du fichier-\n" );
         printf("\t\t B: -Ajout d'elements a la fin du fichier-\n" );
         printf("\t\t C: -Recherche d'un numero de telephone a partir du nom-\n" );
         printf("\t\t D: -Affichage du contenu du fichier-\n" );
         printf("\t\t E: -Changer le nom du fichier de travail-\n" );
         printf("\t\t Q: -Quitter-\n\n" );
         printf("\n\t\t ***Veuillez entrer votre choix***\n\t\t\t=>" );
         c=getch();
         fflush(stdin);
 
         switch (c) {
                      case 'a':
                    case 'A': creation(nomFichier);
                    break;
                    case 'b':
                    case 'B': ajout(nomFichier);
                    break;
                    //case 'c':
                    //case 'C': recherche(nomFichier);
                    //break;
                    case 'd':
                    case 'D': affichage(nomFichier);
                    break;
                    //case 'e':
                    //case 'E': changer(nomFichier);
                    //break;
                    case 'q':
                    case 'Q':exit(-1);
                    default :printf("\t\tValeur erronee\n \t\tTaper une touche" );
                    printf(" pour continuer \n" );
                    }//fin du switch
         getch();
         fflush(stdin);
      }while(1);//tant que VRAI faire ...
}
 
 
 
//fichtel.h fichier header
 
#ifndef __FICHTEL_H
#define __FICHTEL_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#define NB 10
 
personne *rech_nom(personne *, char *);
typedef ptrpersonne (*ptrfonction)(ptrpersonne,char *);
ptrfonction tabfonction[1]={rech_nom};
 
void creation(char *nomFichier);
void ajout(char *nomFichier);
void affichage(char *nomFichier);
 
 
 
 
typedef struct personne{
  char nom[20];
      long int tel;
}personne;
#endif
 
 
//fonction affichage
 
 
#include "fichtel.h"
 
void affichage(char *nomFichier)
{
   personne pers;
   FILE *ptMem;
 
 
  if((ptMem=fopen(nomFichier,"r" ))==NULL)
   {
    printf("Probleme a l'ouverture" );
      exit(-1);
   }
   do
   {
    fread(&pers,sizeof(personne),1,ptMem);
      if(!feof(ptMem))
      {
      printf("\n\tNom : %s\n",pers.nom);
      printf("\n\t\tNumero : %d",pers.tel);
      }
   }while(!feof(ptMem));
   fclose(ptMem);
   getch();
}
 
 
//et voici donc ma fonction ajout qui ne marche pas
 
 
#include "fichtel.h"
 
void ajout(char *nomFichier)
{
 FILE *ptMem;
   personne tab[NB];
   personne pers;
   char c;
   int i;
 
   if (c=='n') return;
 
   if((ptMem=fopen(nomFichier,"a" ))==NULL)
   {
    printf("Probleme a l'ouverture du fichier %s",nomFichier);
      sleep(3);
      exit(-1);
   }
   else
   {
    do
      {
       for(i=0;i<NB;i++)
         {
          printf("\nEntrer le nom de la personne" );
      gets(pers.nom);
            if (strlen(pers.nom)==0) break;
      printf("\nEntrer son numero de telephone" );
      scanf("%d",&pers.tel);
            fflush(stdin);
            tab[i]=pers;
      if(fwrite( tab, sizeof(personne),i,ptMem)!=i)
            {
             printf("probleme lors de l'ecriture du fichier" );
               getch();
               return;
            }
         }
            if (i<NB) break;
      }while(1);
      fclose(ptMem);
   }
}

Reply

Marsh Posté le 13-12-2005 à 07:23:46    

enhancer38 a écrit :

Merci beacoup a toi pour ta reponse...


 
A défaut de lire sa réponse ou de prendre en compte ses remarques c'est déjà bien de le remercier d'avoir perdu de s'être donné du temps pour toi.

Reply

Marsh Posté le 13-12-2005 à 08:55:56    

manu => [:roi]
enhancer => je rêve ou toutes ses remarques te sont passées au dessus ?


Message édité par Harkonnen le 13-12-2005 à 08:56:59

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 13-12-2005 à 09:09:45    

enhancer38 a écrit :


void main (void)


T'a pas l'impression de te moquer du monde là ?
 

  • Pas de balise code
  • Reprise d'une erreur déjà corrigée.


Si tu ne tiens pas compte des remarques qu'on te fait, je n'ai plus rien à ajouter.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 13-12-2005 à 15:34:41    

enhancer38 a écrit :


//et voici donc ma fonction ajout qui ne marche pas

Code :
  1. #include "fichtel.h"
  2. void ajout(char *nomFichier)
  3. {
  4. FILE *ptMem;
  5.    personne tab[NB];
  6.    personne pers;
  7.    char c;
  8.    int i;
  9.    if (c=='n') return;
  10.    if((ptMem=fopen(nomFichier,"a" ))==NULL)
  11.    {
  12.     printf("Probleme a l'ouverture du fichier %s",nomFichier);
  13.       sleep(3);
  14.       exit(-1);
  15.    }
  16.    else
  17.    {
  18.     do
  19.       {
  20.               ...
  21.               ...
  22.               (tout le code du do... while() que je ne recopie pas ici par respect des lecteurs du forum)
  23.               ...
  24.               ...
  25.       }while(1);
  26.       fclose(ptMem);
  27.    }
  28. }



 
Même si c'est très académique, le premier "else" ne sert à rien puisque le "exit" du then fait quitter le programme (donc la fonction). Tu peux donc l'enlever et gagner ainsi un niveau de bloc (donc un niveau d'indentation)
 
Pour le reste, commence par lire (sous-entendu analyser, étudier, approfondir, méditer, bûcher) les corrections de "Emmanuel Delahaye" qu'il a pris soin d'insérer dans ton code et montre lui que tu prends en compte ses remarques !!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed