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

  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
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 765
    Points : 10 748
    Points
    10 748
    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
    Expert confirmé
    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
    Points : 4 155
    Points
    4 155
    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é.

  5. #5
    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.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 765
    Points : 10 748
    Points
    10 748
    Par défaut
    Le problème vient du fait que tu ne fais qu'une lecture (elle n'est pas dans une itération).

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 765
    Points : 10 748
    Points
    10 748
    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).

  8. #8
    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 ?

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    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

  10. #10
    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.

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 765
    Points : 10 748
    Points
    10 748
    Par défaut
    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).
    Ton redefine n'est pas cohérent.
    Tabmot fait 35 caractères
    Alors que TMOT qui redéfinit ceci fait 25*25 + 10 caractères soit : 535

  12. #12
    Invité
    Invité(e)
    Par défaut
    D'accord, pour qu'il y ait 25 caractères tout juste il faudrait mettre OCCURS 1 ?

  13. #13
    Invité
    Invité(e)
    Par défaut
    Si je marque un OCCURS inférieure à 26, j'ai un problème d'index.

  14. #14
    Expert confirmé
    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
    Points : 4 155
    Points
    4 155
    Par défaut
    Citation Envoyé par Alxandr Voir le message
    Si je marque un OCCURS inférieure à 26, j'ai un problème d'index.
    Bonjour.

    J'ai l'impression que tu te mélanges un peu les pinceaux.
    T'as un fichier qui contient 26 lignes, chaque ligne contient deux champs : ==>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     FD FMOTS.
    01   LIGNE-MOT.
           03  FMOT      PIC X(25).
           03  FTYPE     PIC x(10).
    On part de ça, pour le moment, et on y change rien pour la première méthode qui consiste à lire le fichier à chaque fois qu'un nombre est saisi. Le nombre des lignes du fichier importe peu pour le moment. On verra, à la limite plus tard, la deuxième méthode qui consiste à lire le fichier et mettre ses 26 enregistrements dans un tableau.

    - on saisit un nombre
    - on lit le fichier jusqu'à ce qu'on trouve l'enregistrement (ligne) qui a le même rang (ton compteur) que le nombre saisi :
    - si la fin du fichier est atteinte avant de trouver l'enregistrement voulu, on dira que le nombre saisi est invalide.
    - sinon on affiche le mot.
    - et on revient à la saisie tant qu'on n'a pas saisi un code de fin, par exemple 99.

    On verra plus tard pour l'autre méthode si tu es intéressé.

  15. #15
    Invité
    Invité(e)
    Par défaut
    D'accord merci Le code ci-dessus est-il correct maintenant ?
    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
    SAISIE.
               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.
               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
                        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.
    En effet je crée un compteur pour chaque mot qu'il y a dans le fichier. De plus je dis que si le nombre est égale au compteur, alors on affiche ce mot.

  16. #16
    Expert confirmé
    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
    Points : 4 155
    Points
    4 155
    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.

  17. #17
    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.

  18. #18
    Expert confirmé
    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
    Points : 4 155
    Points
    4 155
    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.

  19. #19
    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.

  20. #20
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 765
    Points : 10 748
    Points
    10 748
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 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