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

Cobol Discussion :

Lecture Fichier Séquentiel


Sujet :

Cobol

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Lecture Fichier Séquentiel
    Bonjour à tous

    J'ai un problème sur le langage COBOL qui est le suivant. Je dois parcourir un fichier séquentiel de 26 lignes (composé d'un mot et d'un type). L'utilisateur quant à lui doit entrer un numéro entre 1 et 26. Si l'utilisateur entre 12 cela doit correspondre à la 12e ligne et donc au douzième mot.
    Je sais qu'il faut faire un PERFORM UNTIL ... < 26 pour réussir, mais après je n'ai pas d'idée.

    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 781
    Par défaut
    Ton perform until est effectivement la "base" de l'algorithme donc tu es proche de la solution.

  3. #3
    Invité
    Invité(e)
    Par défaut
    D'accord merci, mais je ne comprends pas comment le nombre saisie par l'utilisateur va reconnaitre le nom associé. Faudrait il faire un compteur, qui compte chaque mot dans le PERFORM UNTIL et de dire que si le nombre saisie par l'Utilisateur est egale au compteur alors on affiche ce mot ?

  4. #4
    Membre Expert
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Par défaut
    - Dans un premier temps compile le et regarde ce que ça donne
    - et puis après il faut que tu boucles sur la saisie pour que l'utilisateur puisse faire plusieurs recherches dans un seul run.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ok quand je compile le programme, il m'affiche tous les enregistrements. J'ai corrigé le programme pour qu'il puisse faire plusieurs recherches sur un même mais ça ne fonctionne toujours pas.
    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
     DISPLAY "Veuillez saisir un nombre entre 1 et 25".
               ACCEPT NOMBRE.
               PERFORM UNTIL NOMBRE < 26
                   DISPLAY "Votre Nombre est supérieur à 26"
                   DISPLAY "veuillez en ressaisir un autre"
                   ACCEPT NOMBRE
               END-PERFORM.
               EXIT.
    
           LIRE-FICHIER.
               MOVE FAUX TO FIN-FICHIER
    
               IF NOMBRE = 0 OR NOMBRE > 26 THEN
                   DISPLAY "ERREUR"
                   ELSE
                   Open input FMOTS.
                   Move 0 to CPT.
                   Perform until CPT = 26 OR FIN-FICHIER = VRAI
                        READ FMOTS AT END MOVE 1 TO CPT END-READ
                        COMPUTE CPT = CPT + 1
                        IF FIN-FICHIER = VRAI
                            DISPLAY "Aucun mot trouvé"
                        ELSE  DISPLAY MMOTS
                           MOVE MMOTS of FMOTS to MOTS of LIGNE-AFFICHAGE
                           DISPLAY "Le mot a decouvrir est un " SMOT
    
                    END-IF
               End-Perform
    
               Display MMOTS.
               Close FMOTS.
               EXIT.

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 781
    Par défaut
    Si tu n'as pas d'outil de debug le mieux est de mettre des display à chaque étape du traitement pour voir ce qu'il se passe.

  7. #7
    Invité
    Invité(e)
    Par défaut
    D'accord il n'y a pas de soucis , de tout de façon je suis obligé de réaliser un tableau, car je dois afficher la première et la dernière lettre du mots affiché

  8. #8
    Membre Expert
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Par défaut
    Je t'ai dit qu'il y a deux parties dans le programme, donc il faut qu'on les retrouve dans ton programme.
    Réfléchis un peu puis code ton programme.
    La partie chargement doit ressembler à ceci :
    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
    000140 Data Division.
    000150 File Section.
    000160*
    000170 FD  FICHIER.
    000180 01  LIGNE-MOT.
    000190     03 FMOT   pic X(25).
    000200     03 FTYPE  pic X(10).
    000210*
    000220 Working-Storage Section.
    000230 77  WCPT    pic 99.
    000240 77  WNBR    pic 99.
    000250 77  WFF     pic 9 value 0.
    000260 01  TAB-MOTS.
    000270     03 LIG-MOT occurs 26.
    000280        05 TMOT   pic X(25).
    000290        05 TTYPE  pic X(10).
    000300 Procedure Division.
    000310 CHARGEMENT-FICHIER.
    000320     open input FICHIER.
    000330     move 0 to WCPT.
    000340     move 0 to WFF.
    000350     move spaces to TAB-MOTS.
    000360     perform until WFF = 1 or WCPT = 26
    000370        read FICHIER
    000380           at end move 1 to WFF
    000390           not at end
    000400              add 1 to WCPT
    000410              move FMOT to TMOT(WCPT)
    000420              move FTYPE to TTYPE(WCPT)
    000430              Display "Chargé : " FMOT " / " FTYPE " en " WCPT.
    000440
    000450     close FICHIER.
    000460 SAISIE.
    .../... à réaliser
    Regarde bien la différence avec ce que tu as donné : l'initialisation, la condition de fin du perform, l'emplacement de l'incrémentation du compteur et le traitement en fin de fichier.

  9. #9
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Par défaut
    Mais à quoi sert la variable WCPT dans cette seconde partie du programme ?

  10. #10
    Membre Expert
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Par défaut
    Bonjour.
    C'est bien ça.
    Mais si la saisie du nombre (rang du mot) doit se répéter, autant lire tout le fichier et le mettre dans un tableau de 26 lignes, le nombre saisi sera tout simplement l'indice du mot recherché.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Merci de votre réponse, mais cela m'affiche toujours le premier mot comme si le fichier ne se lisait pas.
    Voici l'extrait du code en question.
    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
     LIRE-FICHIER.
               Open input FMOTS.
               Move 0 to CPT.
               Read FMOTS at end move 1 to NOMBRE
               Perform until CPT = NOMBRE
                  
                    COMPUTE CPT = CPT + 1
                   
                    IF CPT = NOMBRE THEN
                       Display MMOTS
                    END-IF
                
               End-Perform
               end-read.
               Display MMOTS.
               Close FMOTS.
               
               EXIT.
    Je pense être proche de la réponse, mais je vois pas où est mon erreur.

  12. #12
    Membre Expert
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 781
    Par défaut
    Le problème vient du fait que tu ne fais qu'une lecture (elle n'est pas dans une itération).

  13. #13
    Membre Expert
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 781
    Par défaut
    Citation Envoyé par Hédhili Jaïdane Voir le message
    Bonjour.
    C'est bien ça.
    Mais si la saisie du nombre (rang du mot) doit se répéter, autant lire tout le fichier et le mettre dans un tableau de 26 lignes, le nombre saisi sera tout simplement l'indice du mot recherché.
    C'est effectivement une méthode infaillible et élégante qui n'est (hélas) pas souvent utilisée alors qu'elle peut avoir des utilisations pratiques (pas seulement dans de simples exercices).

  14. #14
    Invité
    Invité(e)
    Par défaut
    Merci de vos réponses Donc la déclaration d'un tableau peut s'effectuer comme ci-contre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                  FD FMOTS.
                          01 TMOT REDEFINES TABMOTS
                               02 MMOTS PIC X(25).
                               02 SMOT PIC x(10).
                         01 TABMOTS
                              02 FILLER PIC X(25)
                               02 FILLER PIC X(10)
    De plus concernant la lecture du fichier j'arrive dorénavant à lire tout le fichier avec tous les mots. Mais il me reste plus qu'à trouver le mot qui correspond au nombre saisi par l'Utilisateur. Voici mon code :
    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
    
               Open input FMOTS.
               Move 0 to CPT.
    
               Perform until CPT = 26
                    READ FMOTS AT END MOVE 1 TO CPT END-READ
                    COMPUTE CPT = CPT + 1
                    DISPLAY CPT
                    Display MMOTS
    
    
               End-Perform
    
               Display MMOTS.
               Close FMOTS.
    Faut-il faire un IF qui précise que si le nombre est égale au compteur alors on affiche ce nombre ?

  15. #15
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 624
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Alxandr Voir le message
    Merci de vos réponses Donc la déclaration d'un tableau peut s'effectuer comme ci-contre ?
    Qui dit tableau, dit occurrences rechechez le mot clef OCCURS de COBOL


    Citation Envoyé par Alxandr Voir le message
    De plus concernant la lecture du fichier j'arrive dorénavant à lire tout le fichier avec tous les mots. Mais il me reste plus qu'à trouver le mot qui correspond au nombre saisi par l'Utilisateur. Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    READ FMOTS AT END MOVE 1 TO CPT END-READ
                    COMPUTE CPT = CPT + 1
    Si c'est pour remettre le compteur à 1 en fin de fichier, c'est dommage

  16. #16
    Invité
    Invité(e)
    Par défaut
    Merci de votre réponse, mais je ne comprends plus rien
    J'ai bien déclaré le tableau comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                   01 TABMOT.
                       02 FILLER PIC X(25).
                       02 FILLER PIC X(10).
                       
                   01 TMOT REDEFINES TABMOT.
                       02 MMOTS PIC X(25) OCCURS 25.
                       02 SMOT PIC x(10).
    Puis corrigé la lecture du fichier comme cela :
    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
    
    Open input FMOTS.
               Move 0 to CPT.
    
               Perform until CPT = 26
                    READ FMOTS AT END MOVE 1 TO CPT END-READ
                    COMPUTE CPT = CPT + 1
    
    
                    IF NOMBRE = CPT THEN
                        DISPLAY MMOTS(CPT)
                        MOVE MMOTS of FMOTS(CPT) to MOTS of LIGNE-AFFICHAGE
                        DISPLAY "Le mot à découvrir est un " SMOT
    
                    END-IF
               End-Perform
    
               Display MMOTS(CPT)
               Close FMOTS.
               
               EXIT.
    Mais cela ne fonctionne plus ... Avant j'avais réussi a attribuer à chaque nombre un numéro.

  17. #17
    Membre Expert
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Par défaut
    Apparemment tu n'as pas avancé.
    Donne moi une petite heure et je te file un exemple s'il n'y a pas d'objections et puis tu promets de faire la deuxième méthode qui consiste à charger tout le fichier dans un tableau.

  18. #18
    Membre Expert
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Par défaut
    Ok, c'est un bon début.
    Alors, mets toi à la place du programme et exécute les instructions de haut en bas et regarde ce que ça peut donner. On appelait ça dérouler un programme à la main.

    Après, essaie de programmer ceci :
    - faire la saisie jusqu'à ce que Nombre Saisi = 99
    * si Nombre Saisi = 0 ou > 26 perform erreur
    * sinon ouverture fichier
    perform lecture fichier jusqu'à ce que Nombre Saisi = rang de l'enregistrement (ton fameux compteur) ou fin fichier atteinte
    si fin fichier ==> erreur non trouvé
    sinon afficher mot trouvé
    bon, c'est fait rapidement à main levée, il y a peut être à boire et manger dedans.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Merci pour votre réponse. Si j'ai bien compris le programme devrait ressembler à ça ?
    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
    SAISIE.
               DISPLAY "Veuillez saisir un nombre entre 1 et 25".
               ACCEPT NOMBRE.
               EXIT.
    
           LIRE-FICHIER.
               MOVE FAUX TO FIN-FICHIER
               
               IF NOMBRE = 0 OR NOMBRE > 26 THEN
                   DISPLAY "ERREUR"
                   ELSE 
                   Open input FMOTS.
                   Move 0 to CPT.
                   Perform until CPT = 26 OR FIN-FICHIER = VRAI
                        READ FMOTS AT END MOVE 1 TO CPT END-READ
                        COMPUTE CPT = CPT + 1
                        IF FIN-FICHIER = VRAI
                            DISPLAY "Aucun mot trouvé"
                        ELSE  DISPLAY MMOTS
                           MOVE MMOTS of FMOTS to MOTS of LIGNE-AFFICHAGE
                           DISPLAY "Le mot a decouvrir est un " SMOT
    
                    END-IF
               End-Perform
    
               Display MMOTS.
               Close FMOTS.
               STOP RUN.
               EXIT.

  20. #20
    Membre Expert
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Par défaut
    Non, il y deux parties dans le programme :
    1- il faut lire le fichier jusqu'à la fin ou si le compteur de lecture dépasse 26, et à chaque lecture il faut incrémenter le compteur de lecture et renseigner les champs du tableau à partir des champs du fichier. Cela revient à charger (stocker) entièrement le fichier dans un tableau. Cela évitera de parcourir le fichier pour chaque nombre saisi ce qui réduira les accès disque.
    2- tu boucles sur la saisie d'un nombre compris entre 01 et 26 et afficher directement le mot correspondant en le piquant du tableau comme indiqué dans mon précédent post.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Lecture de fichier séquentiel
    Par LimaceSpidée dans le forum Général Python
    Réponses: 2
    Dernier message: 09/06/2010, 11h15
  2. [Fichiers séquentiels] compatibilité Delphi <-> C++
    Par soccersoft dans le forum Langage
    Réponses: 2
    Dernier message: 08/07/2004, 10h56
  3. [LG]probleme lecture fichier
    Par yp036871 dans le forum Langage
    Réponses: 2
    Dernier message: 28/01/2004, 19h22
  4. [LG]Probleme lecture fichier file of ....
    Par John_win dans le forum Langage
    Réponses: 11
    Dernier message: 11/11/2003, 18h53
  5. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08

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