IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Répertoire téléphonique


Sujet :

C

  1. #41
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Voici un code de base qui fonctionne.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    #include <stdio.h>
    #include <stdlib.h>
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define SZ_NOM			(15)
    #define SZ_PRENOM		(15)
    #define SZ_TEL			(10)
     
    // Structure pour le nom,prenom et télephone
    typedef struct {
        char nom[SZ_NOM + 1];
        char prenom[SZ_PRENOM + 1];
        char tel[SZ_TEL + 1];
    } t_personne;
     
    // Fonction permettant de saisir une chaine en enlevant le '\n'
    void myGets(char *prompt, char *chaine, unsigned short size)
    {
    	char *pt;
    	fputs(prompt, stdout);
    	fgets(chaine, size, stdin);
    	if ((pt=strchr(chaine, '\n')) != NULL)
    		*pt='\0';
    }
     
    // Menu
    unsigned short menu()
    {
    	char saisie[100];
    	unsigned short choix;
    	while(1)
    	{
    		printf("------- Repertoire 2013-------\n");
    		printf("1 : ouvre un fichier annuaire\n");
    		printf("2 : Ajouter une fiche \n");
    		printf("3 : Liste des noms \n");
    		printf("0 : Quitter");
    		printf("\nVotre choix ?");
    		fflush(stdout);
    		fgets(saisie, 100, stdin);
    		if (sscanf(saisie, "%hu", &choix) == 1 && choix >= 0 && choix <= 3) break;
    		printf("Choix incorrect - Recommencez !!!\n");
    	}
    	return choix;
    }
     
    FILE *ouvrir_fichier()
    {
    	char nom[100];
    	char *pt;
    	printf("**Ouverture du fichier**\n\n");
    	myGets("Saisir un nom pour le fichier: ", nom, 100);
     
    	// Vérification extension ".txt" n'existe pas
    	if ((pt=strrchr(nom, '.')) == NULL || strcmp(pt, ".txt") != 0)
    		strcat(nom,".txt");// on rajoute l'extension .txt au fichier
     
    	return fopen(nom, "a+");
    }
     
    void ajouterNom(FILE *fp)
    {
    	t_personne p;
     
    	printf("Ajouter nom\n");
    	myGets("Entrer le nom :", p.nom, SZ_NOM);
    	myGets("Entrer le prénom :", p.prenom, SZ_PRENOM);
    	myGets("Entrer le tel :", p.tel, SZ_TEL);
    	fprintf(fp, "%s:%s:%s\n", p.nom, p.prenom, p.tel);
    	fflush(fp);
    	printf("enregistrement %s:%s:%s ok\n", p.nom, p.prenom, p.tel);
    }
     
    void listerNom(FILE *fp)
    {
    	t_personne p;
    	long pos;
    	char ligne[100];
     
    	// Récupération position courante
    	pos=ftell(fp);
     
    	// Positionnement au début du fichier
    	fseek(fp, 0L, SEEK_SET);
     
    	// Lecture fichier
    	while (fgets(ligne, 100, fp) != NULL)
    	{
    		printf(ligne);
    	}
     
    	// Repositionnement à la position initiale du fichier
    	fseek(fp, pos, SEEK_SET);
    }
     
     
    int main()
    {
        FILE *fp=NULL;
    	unsigned short choix;
     
        while((choix=menu()) != 0)
    	{
    		switch (choix)
    		{
    			case 1:
    				fp=ouvrir_fichier();
    				if (fp == NULL)
    					fprintf(stderr, "Erreur ouverture fichier\n");
    				break;
    			case 2:
    				if (fp == NULL)
    				{
    					fprintf(stderr, "Il faut d'abord ouvrir le fichier\n");
    					break;
    				}
    				ajouterNom(fp);
    				break;  
    			case 3:
    				if (fp == NULL)
    				{
    					fprintf(stderr, "Il faut d'abord ouvrir le fichier\n");
    					break;
    				}
    				listerNom(fp);
    				break;  
    			case 0:
    				if (fp != NULL) fclose(fp);
    		}
    	}
    	return 0;
    }

    Je l'ai écrit pour essayer de te montrer un cheminement possible. C'est pas super super (beaucoup d'éléments du main dépendent du contenu d''autres fonctions ce qui est un frein à la programmation "structurée indépendante") mais ça te donnera un point de départ et une idée des problèmes auxquels il faut penser. Par exemple aller écrire dans un fichier qui n'est pas encore ouvert. Ou bien penser à se remettre à la position exacte après avoir lu le fichier pour pouvoir continuer ensuite à écrire dedans...

  2. #42
    Invité
    Invité(e)
    Par défaut
    merci a toi

  3. #43
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Pourriez vous m'expliquer ceci Pourquoi mettre (nom)+1 ?





    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define SZ_NOM			(15)
    #define SZ_PRENOM		(15)
    #define SZ_TEL			(10)
     
    // Structure pour le nom,prenom et télephone
    typedef struct {
        char nom[SZ_NOM + 1];
        char prenom[SZ_PRENOM + 1];
        char tel[SZ_TEL + 1];
    } t_personne;

  4. #44
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Une chaine de caractères est un tableau de caractères possédant un caractère particulier '\0' afin qu'on sache où s'arrêter.

    En écrivant "SZ + 1" j'indique aux autres programmeurs que j'ai bien pensé à réserver une place pour ce caractère. Le membre "nom" aura donc 15 caractères "utiles" et un caractère de gestion '\0'...

    Accessoirement, comme la fonction fgets() y pense aussi (si je demande fgets(..., 100, ...) elle n'en remplira que 99 et en gardera un pour le '\0'), il faudrait modifier la fonction myGets() et la remplacer par celle-ci

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Fonction permettant de saisir une chaine en enlevant le '\n'
    void myGets(char *prompt, char *chaine, unsigned short size)
    {
    	char *pt;
    	fputs(prompt, stdout);
    	fgets(chaine, size + 1, stdin);
    	if ((pt=strchr(chaine, '\n')) != NULL)
    		*pt='\0';
    }

    Il y a d'ailleurs pas mal de truc à rajouter. Par exemple fermer le fichier précédent si on décide d'en ouvrir un autre. Rajouter aussi le menu "fermer fichier"
    Accessoirement le pos=ftell() est un peu idiot vu qu'on sait qu'on est toujours en fin de fichier (un fseek(fp, 0L, SEEK_END) te place automatiquement en fin de fichier). On voit clairement que c'est un truc tapé vite fait et peu réfléchi...

Discussions similaires

  1. Réponses: 15
    Dernier message: 08/02/2013, 11h22
  2. Création d'un répertoire téléphonique
    Par ronley dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/08/2011, 12h52
  3. [AC-2003] Création d'un répertoire téléphonique
    Par vanille28 dans le forum Modélisation
    Réponses: 13
    Dernier message: 15/10/2009, 19h38
  4. répertoire téléphonique avec état conditionnel
    Par Charliegir dans le forum IHM
    Réponses: 1
    Dernier message: 19/03/2009, 03h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo