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écupérer le numéro d'ordre d'un enregistrement


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 69
    Par défaut Récupérer le numéro d'ordre d'un enregistrement
    Bonsoir/Bonjour à tous.

    Je sollicite vos lumières.

    Problème : Soit truc une structure avec ses champs champ1, champ2 et champ3. On effectue des enregistrements de truc dans un fichier ouvert en mode ajout :
    - les valeurs de champ1 et champ2 sont saisies par l'utilisateur,
    - la valeur de champ3 vaut numéro_d'ordre_de_l'enregistrement_courant + 1. (Je suppose que le premier enregistrement du fichier a le numéro 0.) Cette valeur n'est donc pas saisie par l'utilisateur.

    Voici une illustration :
    Nom : illustration.JPG
Affichages : 826
Taille : 29,5 Ko

    Ma question est donc : Comment récupérer le numéro d'ordre de l'enregistrement en cours ?

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par iks37 Voir le message
    Voici une illustration :
    Nom : illustration.JPG
Affichages : 826
Taille : 29,5 Ko
    Très bien faite. T'as utilisé quel logiciel ???

    Citation Envoyé par iks37 Voir le message
    Ma question est donc : Comment récupérer le numéro d'ordre de l'enregistrement en cours ?
    Ben ça me semble pas super compliqué: tu récupères le champ 3 et tu fais "-1" (ou alors j'ai pas compris un truc)...
    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. #3
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 69
    Par défaut Récupérer le numéro d'ordre d'un enregistrement
    Sve@r,

    Il me semble que vous n'avez pas compris le problème.

    Considérons un fichier ouvert en mode ajout dans lequel on stocke des enregistrements.
    Chaque enregistrement est une ligne comprenant les valeurs de 3 champs. Les valeurs des deux premiers champs sont fournies par l'utilisateur, tandis que la valeur du troisième champ n'est pas fournie par l'utilisateur. Le numéro de l'enregistrement en cours est affecté à ce troisième champ.

    On sait que les enregistrements d'un fichier reçoivent implicitement un numéro d'ordre. Cette numérotation n'est pas donnée par le programmeur. Le premier enregistrement reçoit le numéro 0, le deuxième reçoit le numéro 1, le troisième le numéro 2, et ainsi de suite.
    C'est ce numéro d'ordre que l'on affecte au troisième champ. Alors comment le récupérer ?

    Le fichier étant ouvert en mode ajout, lors de la prochaine session de saisies, les anciens enregistrements seront conservés. De plus, le troisième champ du premier enregistrement (de la nouvelle session) recevra le dernier numéro d'ordre (de la session précédente) augmenté de 1.

    Concernant l'illustration proposée : Je l'ai réalisée sous Word, puis j'ai effectué une capture.
    Très bien faite. T'as utilisé quel logiciel ???
    Est-ce de l'ironie ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Très bien faite.
    Il y a pourtant une faute le champ 2 doit être valchp2_2 et non valchp1_2.
    Oui cela semble bête, mais c'est assez troublant parce qu'on peut se demander si c'est normal ou pas


    Citation Envoyé par iks37 Voir le message
    On sait que les enregistrements d'un fichier reçoivent implicitement un numéro d'ordre. Cette numérotation n'est pas donnée par le programmeur. Le premier enregistrement reçoit le numéro 0, le deuxième reçoit le numéro 1, le troisième le numéro 2, et ainsi de suite.
    C'est ce numéro d'ordre que l'on affecte au troisième champ. Alors comment le récupérer ?

    Le fichier étant ouvert en mode ajout, lors de la prochaine session de saisies, les anciens enregistrements seront conservés. De plus, le troisième champ du premier enregistrement (de la nouvelle session) recevra le dernier numéro d'ordre (de la session précédente) augmenté de 1.
    Donc tu es en train de nous dire que ce champ "numéro d'ordre d'un enregistrement" (qui est un bête compteur) ... et juste le numéro de ligne du fichier
    Donc un truc totalement inutile parce que, tu as beau parler du mode ajout, mais 1 moment ou 1 autre tu vas lire ton fichier avec une boucle ... quoique c'est le genre de "truc" qui pose + de problèmes qu'autre chose parce qu'il faut qu'il soit cohérent (tout ce qui est synchronisation manuelle c'est long et tu n'es JAMAIS à l'abri d'1 erreur )

    Et pour répondre à la question , il faut ouvrir 2 fois ton fichier : 1 fois en lecture pour prendre le dernier "numéro d'ordre" (il me semble que fopen a un mode "lecture en fin de fichier" ou c'est le pointeur fichier qu'on peut déplacer à vérifier j'ai la flemme ) et ensuite fermer le fichier et le réouvrir en mode écriture (ajout effectivement c'est + pratique, mais c'est 1 détail)
    Suite à la réponse de @Sve@r mon V.D.D (mon voisin du dessous), prendre le dernier "numéro d'ordre" ne pas se faire en positionnant le pointeur fichier en fin de fichier : il faut donc lire ton fichier jusqu'au dernier numéro d'ordre (<- ce qui rend le truc encore + inutile ).
    Et effectivement , tu n'as pas besoin d'ouvrir 2 fois ton fichier, mais avec le mode "lecture/ écriture" il faut bien [bien] lire la documentation pour ne pas se faire avoir : passer d'1 mode à l'autre et où va se positionner le pointeur fichier.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par iks37 Voir le message
    Il me semble que vous n'avez pas compris le problème.
    Hé oui. Ca me paraissait trop évident !!!

    Citation Envoyé par iks37 Voir le message
    Le fichier étant ouvert en mode ajout, lors de la prochaine session de saisies, les anciens enregistrements seront conservés. De plus, le troisième champ du premier enregistrement (de la nouvelle session) recevra le dernier numéro d'ordre (de la session précédente) augmenté de 1.
    Ok, je comprends mieux. Je vais redire donc ça en plus simple: le fichier contient n lignes de 3 colonnes où la 3° colonne contient le numéro de ligne en cours. Il faut qu'à chaque ouverture on sache combien il a de lignes pour pouvoir mettre le compteur à la bonne valeur pour que les lignes ajoutées ensuite continuent à avoir la bonne valeur. Exact ? Sauf que je ne vois pas trop ce que vient faire le n° d'ordre dans cette histoire. Il suffisait de dire juste que chaque ligne contenait en 3° champ le n° de la ligne courante et c'était bien suffisant.

    Donc solution: une fonction qui compte les lignes du fichier. Il lui suffit de se positionner au début (rewind()) et lire les lignes en boucle (fgets()) et compter. Et en plus même pas besoin de se repositionner à la fin car c'est fait automatiquement à chaque écriture lorsque le fichier a été ouvert en mode "a" (mode "a+" puisque le comptage implique lecture).

    Donc un truc de ce style
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    unsigned long cpt_lignes(FILE *fp) {
        char ligne[1024 + 1];
        unsigned long cpt;
        rewind(fp);
        for (cpt=0; fgets(ligne, 1024 + 1, fp) != NULL; cpt++);
        return cpt;
    }
    Tu appelles la fonction juste après l'ouverture et tu as en retour le nb de lignes existantes.

    Maintenant si le mode "a+" est trop contraignant, alors rien n'interdit à la fonction d'ouvrir le fichier en mode "r" et le refermer à la fin. Ca marchera même si le fichier a été déjà ouvert ailleurs en mode "a" (mais faudra faire gaffe à ne pas l'appeler entre les écritures car là il peut y avoir conflit).

    Citation Envoyé par iks37 Voir le message
    Est-ce de l'ironie ?
    Non, jamais. Je pensais plutôt à un outil de représentation mathématique qui m'aurait intéressé.

    Citation Envoyé par foetus Voir le message
    Il y a pourtant une faute le champ 2 doit être valchp2_2 et non valchp1_2.
    Je parlais de l'image, pas de son contenu.Mais c'est bien d'examiner les trucs en détail

    Citation Envoyé par foetus Voir le message
    (il me semble que fopen a un mode "lecture en fin de fichier"
    C'est le mode "a+" mais son but n'est pas de "lire en fin de fichier" (on peut pas lire à la fin car justement on est à la fin et après la fin il n'y a plus rien ). C'est un mode qui ouvre le fichier en écriture en plaçant la tête de lecture/écriture à la fin tout en offrant la possibilité de lire à condition évidemment de déplacer au préalable la tête de lecture/écriture sur une partie lisible du fichier. Et comme je l'ai dit, dans ce cas là pas besoin de se remettre sur la fin car c'est fait automatiquement à chaque écriture.

    Citation Envoyé par foetus Voir le message
    ou c'est le pointeur fichier qu'on peut déplacer
    Oui, avec fseek() qui permet de se déplacer où on veut et rewind(fichier) qui est un rembobinage équivalent à un fseek(fichier, 0, SEEK_SET).
    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. #6
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 69
    Par défaut Ich habe nicht einverstanden !
    Je n'ai pas compris vos explications.

    Voici la fonction entregistrerLien, veuillez lui ajouter les instructions utiles sachant que :
    - un lien est composé d'un couple d'entiers et d'un numéro de lien
    - le numéro de lien est le numéro d'ordre de l'enregistrement en cours (désigné par numéro de ligne par Sve@r)

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "fichier_init.h"
    
    void enregistrerLien(int T[], int nbre)
    {
        struct lien couple;
        int i;
        FILE * fichier_graphe;
    
        fichier_graphe = fopen("fichier_des_liens.txt", "a+");
        if(fichier_graphe == NULL)
        {
            printf("ERREUR D'OUVERTURE DU FICHIER fichier_des_liens.txt\n\n");
        }
    
        for(i=0; i<(nbre-1); i++)
        {
            couple.compo1 = T[i];
            couple.compo2 = T[i+1];
            couple.numerolien = numéro_d'ordre_de_l'enregistrement_courant ;
            fprintf(fichier_graphe, "%d ; %d  %d\n", couple.compo1, couple.compo2, couple.numerolien);        
        }
        fclose(fichier_graphe);
    }

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par iks37 Voir le message
    Je n'ai pas compris vos explications.
    Hé, c'est quand-même pas compliqué quoi. Tu veux connaitre le nombre de lignes du fichier donc tu écris une fonction qui compte le nombre de lignes du fichier

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "fichier_init.h"
     
    unsigned long cpt_lignes(FILE *fp) {
        char ligne[1024 + 1];
        unsigned long cpt;
        unsigned long pos;
        pos=ftell(fp);           // Mémoriser position
        rewind(fp);              // Rembobinage
        for (cpt=0; fgets(ligne, 1024 + 1, fp) != NULL; cpt++);              // Compter les lignes
        fseek(fp, pos, SEEK_SET);                      // Revenir à la position (ainsi la fonction laisse le fichier dans le même état)
        return cpt;                             // Renvoyer le nb de lignes
    }
     
    int enregistrerLien(int T[], int nbre)
    {
        struct lien couple;
        size_t i;
        FILE *fichier_graphe;
        unsigned long nb_lignes;
     
        fichier_graphe = fopen("fichier_des_liens.txt", "a+");
     
        if (fichier_graphe == NULL)
        {
            printf("ERREUR D'OUVERTURE DU FICHIER fichier_des_liens.txt\n\n");
            return -1;           // Ou alors tu veux quand-même écrire dans un fichier qui n'a pas été ouvert !!!!!
        }
     
        nb_lignes=cpt_lignes(fichier_graphe);
        for(i=0; i<(nbre-1); i++) {
            couple.compo1 = T[i];
            couple.compo2 = T[i+1];
            couple.numerolien = nb_lignes++;
            fprintf(fichier_graphe, "%d ; %d  %d\n", couple.compo1, couple.compo2, couple.numerolien);
           //  Ce serait pas plus simple d'écrire directement fprintf(fichier_graphe, "%d ; %d  %d\n", T[i], T[i+1], nb_lignes++);  ???
        }
        fclose(fichier_graphe);
        return 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]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [debutant]récupérer le numéro d'ordre d'un champ de formulaire
    Par dimi2 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/07/2008, 19h28
  2. Réponses: 2
    Dernier message: 01/04/2008, 19h36
  3. Récupérer le numéro d'enregistrement dans une zone de texte
    Par The_Super_Steph dans le forum VBA Access
    Réponses: 18
    Dernier message: 16/05/2007, 08h50
  4. Récupérer le numéro du dernier enregistrement
    Par Bazooka dans le forum Access
    Réponses: 3
    Dernier message: 26/01/2007, 23h22
  5. Réponses: 1
    Dernier message: 16/09/2005, 14h07

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