Emmanuel Delahaye C is a sharp tool | 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/
|