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 :

Manipulation de fichier


Sujet :

C

  1. #21
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 52
    Points : 26
    Points
    26
    Par défaut
    donc je dois reprendre tout mon code en utilisant fprintf et fscan uniquement sans fwrite et fread ?
    parceque je veux que mon code soit lisible , mais est ce que fgets est convenable aussi ?

  2. #22
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par KEVIN.DLL Voir le message
    donc je dois reprendre tout mon code en utilisant fprintf et fscan uniquement sans fwrite et fread ?
    parceque je veux que mon code soit lisible , mais est ce que fgets est convenable aussi ?
    Ce n'est pas parce que tu utilises fscanf() au lieu de fread() que ton code sera plus lisible. Pire, chaque fonction a un but particulier et si tu utilises une fonctionX pour effectuer une action qui n'est pas celle pour laquelle elle a été écrite (et pour laquelle il existe une fonctionY) tu devras "magouiller" pour l'adapter ce qui rendra ton code encore moins lisible.

    Exemple: lire une ligne d'un fichier en utilisant fgetc
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char ligne[100];
    char c;
    int i=0;
    do {
        c=fgetc(fp);
        ligne[i++]=c;
    } while (c != '\n');
    ligne[i]=0;

    Exemple: lire une ligne d'un fichier en utilisant fread
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char ligne[100];
    char c;
    int i=0;
    do {
        fread(&c, sizeof(char), 1, fp);
        ligne[i++]=c;
    } while (c != '\n');
    ligne[i]=0;

    Exemple: lire une ligne d'un fichier en utilisant fgets
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char ligne[100];
    fgets(ligne, 100, fp);

    Quel code est le plus lisible ???

    Tout code est lisible s'il est écrit de façon lisible. Aéré, avec des commentaires en tête de chaque bloc expliquant ce que tu vas faire, etc
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #23
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 52
    Points : 26
    Points
    26
    Par défaut
    je pense que je vais garder et essayer d'harmoniser le code source .
    je vais me pencher sur les autres fonctions pour la modification et la suppression ; réorganiser le code et vous montrez

  4. #24
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 52
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben pour les fonctions tu commences à comprendre et à t'en sortir. Par exemple la fonction afficherInfo est très bien (à l'exception de la ligne 15 qui doit s'écrire struct employe E).

    Maintenant regarde: quelle différence il y a entre "afficher tous les employés" et "afficher un seul employé" ??? Dans un cas tu as un matricule et dans l'autre tu n'en as pas.

    Donc si tu réécris ta fonction ainsi
    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
    void afficherInfo(FILE*fichier, int matricule)
    {
    	struct employe E;
    	long pos=ftell(fichier);
    	rewind(fichier);
    	while(fscanf(fichier,"%d\n%s\n%s\n%s\n%d\n",&E.matricule,E.nom,E.prenom,E.sexe)>0)
    	{
    		if (matricule == -1 || E.matricule == matricule)
    		{
    			printf("matricule: %d\n ",E.matricule);
    			printf("Nom et prenom:,%s %s\n",E.nom,E.sexe);
    			printf("sexe: %s\n",E.sexe);
    		}
    	}
    	fseek(fichier, pos, SEEK_SET);
    }

    Déjà en lui rajoutant une gestion de position à base de ftell(), rewind() et fseek() elle devient indépendante de la position du marqueur de fichier. Quelle que soit cette position, quand elle commence elle se place au début du fichier et quand elle finit, elle restaure le marqueur à la position qu'il avait. Donc tu peux l'appeler quand tu veux sans dégats collatéraux.
    Et en plus elle est maintenant capable d'afficher (selon ton choix) un seul employé ou tous les employés. Quand tu veux un seul employé de matricule X tu appelles ta fonction comme ceci: afficherInfo(fp, X) et quand tu veux tous les employés tu l'appelles comme cela: afficherInfo(fp, -1). C'est ça aussi l'avantage des fonctions: elles sont capables de rendre un code facilement adaptable aux circonstances...

    Ensuite il existe des outils pour améliorer l'ergonomie. Par exemple si tu regardes la fonction, tu vois que le véritable travail commence à 3 tabulations du bord. Tu perds de l'espace pour coder.
    Si maintenant tu la réécris comme cela
    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
    void afficherInfo(FILE*fichier, int matricule)
    {
    	struct employe E;
    	long pos=ftell(fichier);
    	rewind(fichier);
    	while(fscanf(fichier,"%d\n%s\n%s\n%s\n%d\n",&E.matricule,E.nom,E.prenom,E.sexe)>0)
    	{
    		if (matricule != -1 && E.matricule != matricule) continue;
     
    		printf("matricule: %d\n ",E.matricule);
    		printf("Nom et prenom:,%s %s\n",E.nom,E.sexe);
    		printf("sexe: %s\n",E.sexe);
    	}
    	fseek(fichier, pos, SEEK_SET);
    }
    Algorithmiquement c'est pareil. Au lieu de chercher les informations qui m'intéressent pour n'afficher que celles-ci, je cherche et écarte celles qui ne m'intéressent pas et affiche toutes les autres (attention aux lois de "De Morgan" => non(A et B) = non(A) OU no(B) et non(A ou B) = non(A) ET non(B)). Mais je gagne une tabulation sur la gauche. Mais ça c'est du détail pour plus tard (en plus certains profs n'aiment pas les break/continue).
    problème a ce niveau quand j’essaie d'utiliser cette fonction dans mon main , rien ne s'affiche , aucun donné entrée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case 2:
    	afficherInfo(fp,-1);
    	break;

  5. #25
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par KEVIN.DLL Voir le message
    problème a ce niveau quand j’essaie d'utiliser cette fonction dans mon main , rien ne s'affiche , aucun donné entrée.
    Tu as 3 possibilités
    1. la fonction n'est pas appelée
    2. le fscanf() renvoie un nombre <= 0
    3. le test sur le matricule est toujours vrai


    En mettant du printf() aux bons endroits, tu pourras détecter laquelle de ces 3 possibilités est la bonne pour la réparer. Ben oui, faut pas te contenter de regarder ton code et d'attendre que ça te tombe tout cuit dans le bec. Faut aussi réfléchir et investiguer...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #26
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 52
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Tu as 3 possibilités
    1. la fonction n'est pas appelée
    2. le fscanf() renvoie un nombre <= 0
    3. le test sur le matricule est toujours vrai


    En mettant du printf() aux bons endroits, tu pourras détecter laquelle de ces 3 possibilités est la bonne pour la réparer. Ben oui, faut pas te contenter de regarder ton code et d'attendre que ça te tombe tout cuit dans le bec. Faut aussi réfléchir et investiguer...
    mais j'ai appelle la fonction ajout de la même manière et c’était bon mais pour elle c'est étrange tu m'as même donné la marche à suivre pour appeler la fonction .
    afficherInfo(fp, X) et afficherInfo(fp, -1)

  7. #27
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par KEVIN.DLL Voir le message
    mais j'ai appelle la fonction ajout de la même manière et c’était bon mais pour elle c'est étrange tu m'as même donné la marche à suivre pour appeler la fonction .
    afficherInfo(fp, X) et afficherInfo(fp, -1)
    Oui, sur le papier cette fonction "fonctionne". D'ailleurs tu n'as même pas besoin de moi pour le voir: soit tu l'appelles avec matricule=-1 et dans ce cas le test étant toujours faux le continue ne se fait pas et tous les ouvriers sont alors affichés ; soit tu l'appelles avec un matricule X et dans ce cas la première partie du test étant toujours vraie, seule la seconde partie du test est prise en considération c.a.d. quand le matricule lu est différent du matricule saisi. A ce moment là, le test devient faux pour un seul ouvrier qui est alors affiché.

    Ce qui permet de descendre les possibilités à seulement 2 hypothèses:
    1. la fonction n'est pas appelée (le case 2 ne passe pas)...
    2. le fscanf() renvoie un nombre <= 0

    ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #28
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 52
    Points : 26
    Points
    26
    Par défaut
    Code : 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
    #include<stdio.h>
    #include <stdlib.h>
    /*structure utilise*/
    struct employe   
    {
    int matricule;
    char nom[50];
    char prenom [50];
    char sexe[2];
    char nomfichier[30]; 
    } ;
    /*fonction pour afficher les informations*/
    void afficherInfo(FILE*fichier, int matricule)
    {
    	struct employe E;
    	long pos=ftell(fichier);
    	rewind(fichier);
    	while(fscanf(fichier,"%d\n%s\n%s\n%s\n%d\n",&E.matricule,E.nom,E.prenom,E.sexe)>0)
    	{
    		if (matricule != -1 && E.matricule != matricule) continue;
     
    		printf("matricule: %d\n ",E.matricule);
    		printf("Nom et prenom:,%s %s\n",E.nom,E.sexe);
    		printf("sexe: %s\n",E.sexe);
    	}
    	fseek(fichier, pos, SEEK_SET);
    }
     
    /*fonction pour ajouter des donnees aux fichiers */
    void ajout(FILE*fichier)
    {
        char nomfichier[30];
    	employe E;
    	fichier=fopen(nomfichier,"w");
    	printf("saississez le numero matricule");
    	scanf("%d",E.matricule);
    	printf("nom :");
    	scanf("%s",E.prenom);
    	printf("sexe :");
    	scanf("%s",E.sexe);
    	fprintf(fichier, "%d %s %s %s \n",E.matricule,&E.nom,&E.prenom,&E.sexe);
    	fclose(fichier);
    }
     
    /*fonction pour supprimer une donnee */
     
    /*programme principal*/
    main()
    {
    employe E;
    int i,n;
        char nomfichier[30];
        FILE *fichier ;
        printf("Entrez le nom du fichier :\n ");
        scanf("%s", nomfichier);
        fichier=fopen(nomfichier,"w");
    	for ( i=0 ;i<4;i++)
    	{
    		printf("employe Numero %d \n ",i+1);
    		printf("entrez votre matricule SVP \n");
    		scanf("%d", E.matricule);
    		printf("entrez votre nom SVP \n");
    		scanf("%s", &
    		E.nom);
    		printf("entrez votre prenom svp\n");
    		scanf("%s", &E.prenom);
    		printf("sexe M/F \n");
    		scanf("%s", &E.sexe);
     
    		fprintf(fichier, "%d %s %s %s \n",E.matricule,&E.nom,&E.prenom,&E.sexe);
    	}/*fermetture du fichier */
    	fclose(fichier);
     
    		printf("------------menu--------------------------------------\n");
    	printf("1-ajouter un employe a la liste                       \n");
    	printf("2-affichage de tous les enregistrements de ce fichier \n");
    	printf("3-modification des informations d'un employe'         \n");
    	printf("4-consultation a partir du matricule                    ");
    	printf("5-supprimer une info grace a son matricule            \n");
    	printf("------------------------------------------------------\n");
    	scanf("%d",&n);
     
    	switch(n)
    	        {
    			case 1: 	ajout(fp);
     
    			break;
     
    			case 2:
              afficherInfo(fp,-1);
    			break;
            case 3: 	
    	        break;
     
    	        case 4: 	
    	        break;
     
    			}
     
     
    return 0;
    }
    c'est ainsi que j'ai procede

  9. #29
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Pfff ton code ne compile même pas. Je me demande alors comment tu peux faire pour dire que ça ne fonctionne pas !!!
    Maintenant tu réfléchis à tout ce qui t'a été dit tout en corrélant ça dans ta tête à tout ce que tu as déjà écrit, ce qui donne (en vrac) les éléments de réflexion suivants (je parle ici pour toi)
    • pourquoi j'ouvre mon fichier en mode "w" si je veux le relire ?
    • pourquoi je ferme mon fichier avant d'avoir fini de travailler dedans (et en plus je le ferme 2 fois) ?
    • pourquoi tantôt je mets du "&", tantôt je n'en mets pas, pour les mêmes éléments ?
    • pourquoi j'écris mes infos sur une seule ligne mais je tente de les lire comme si elles étaient écrites sur n lignes ?
    • pourquoi, quand ceux qui me répondent et qui utilisent leurs propres conventions de nommage (telle que "fp" pour "file pointeur") ne suis-je pas capable de comprendre de quoi il s'agit et de raccorder ça à ma propre façon de nommer ce "file pointeur" ?


    Et surtout tu arrêtes de faire ta faignasse et tu bosses au lieu d'attendre que les autres bossent pour toi !!!


    PS: au fait, j'avais raison ; l'une de mes deux hypothèses était bien la bonne: le fscanf() renvoyait bien -1...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Manipulation de fichier (copier, supprimer, déplacer)
    Par Guigui_ dans le forum Général Python
    Réponses: 1
    Dernier message: 21/10/2004, 10h26
  2. Manipulation des fichiers
    Par monsau dans le forum Langage
    Réponses: 7
    Dernier message: 21/09/2004, 17h45
  3. [LG]Manipulation de fichiers
    Par yffick dans le forum Langage
    Réponses: 29
    Dernier message: 10/01/2004, 15h04
  4. Manipulation de fichiers - gestion d'extensions
    Par ulukai dans le forum Linux
    Réponses: 13
    Dernier message: 02/07/2003, 15h28
  5. Réponses: 2
    Dernier message: 18/01/2003, 17h06

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