Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3017 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1264169
enhancer38
Posté le 11-12-2005 à 21:56:15  profilanswer
 

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);
}

mood
Publicité
Posté le 11-12-2005 à 21:56:15  profilanswer
 

n°1264193
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-12-2005 à 23:15:23  profilanswer
 

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/
n°1265157
enhancer38
Posté le 13-12-2005 à 06:30:41  profilanswer
 

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);
   }
}

n°1265162
Profil sup​primé
Posté le 13-12-2005 à 07:23:46  answer
 

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.

n°1265171
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 13-12-2005 à 08:55:56  profilanswer
 

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)
n°1265177
Emmanuel D​elahaye
C is a sharp tool
Posté le 13-12-2005 à 09:09:45  profilanswer
 

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/
n°1265614
Sve@r
Posté le 13-12-2005 à 15:34:41  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
probleme avec tableauAide pour une requete
probleme de programmation sous matlab[CSS] problème position div
Problème avec Matlab : commande xlsread et xlswriteprobleme mise en page
OpenGL : problème de Flou sur les imagesProbleme Console Java !!
Problème de htaccessbesoin d aide pour mon site merci
Plus de sujets relatifs à : problème langage C besoin d'aide...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR