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

Contribuez Discussion :

Compréhension exacte du READ fichier AT END


Sujet :

Contribuez

  1. #1
    Membre du Club
    Compréhension exacte du READ fichier AT END
    Bonjour à tous,

    je suis en train d 'analyser un code source d'un gros programme de gestion de paie en cobol, je tombe souvent sur l'instruction de lecture d'un fichier ; pour info je n'ai pas d'accès à la DATA DIVISION (verrouillée ) donc je n'ai aucune visibilité sur la structure du fichier à lire , mais j'ai l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    READ  ME-FICHIER
                         AT END    
           MOVE  HIGH-VALUE  TO  ME00  ME99
           MOVE  '1'  TO  ME-CFIN
                     NOT  AT END  
           ADD    1   TO  ME-CTRELU
        END-READ.
    je dispose d'un outil de couverture du code , qui permet de voir quelles instructions ont été exécutée (affichées en vert) et celles non exécutées (affichées en rouge) , et justement sur ce bloc , ce qui vient derrière le NOT AT END qui reste en rouge , on m’explique que la raison est que le fichier ME EST VIDE ;

    Je ne comprends pas le fonctionnement du" read at end ....... not at end " , est il possible de m'expliquer? si on arrive pas à la fin du fichier voudrait il dire que le fichier est impérativement vide?

    Merci beaucoup



  2. #2
    Expert confirmé
    Prière de déplacer ou faire déplacer cette discussion dans le forum principal Cobol.

    Bonjour.

    Pour te répondre de façon plus appropriée et plus précise,il nous manque le compilateur et l'OS que tu ne nous as pas donnés.
    Cependant, et indépendamment de ton outil de couverture du code, le AT END est exécuté quand il n'y a plus d'enregistrements disponibles dans le fichier lors de l'exécution d'une lecture séquentielle dans le mode d'accès SEQUENTIAL ou DYNAMIC (READ NEXT, PRIOR, LAST, FIRST). Le NOT AT END est juste la condition contraire.
    Maintenant, si le fichier est vide, à l'OPEN on peut tester le statut du fichier pour le savoir. Si on ne le fait pas, l'indicateur de "disponibilité d'un enregistrement suivant" est mis à "false" et le traitement continue. A la première lecture séquentielle, on tombe dans le AT END.
    C'est le cas de la plupart des compilateurs courants sur la plupart des OS. Il se peut que dans certains cas de figures, le programme s'arrête à l'OPEN si le fichier est vide et qu'il n'y a pas de traitement d'erreurs prévu.

  3. #3
    Membre du Club
    Désolée je ne sais pa commenjt déplacer cette discussion.

    Par contre ton aide m'a été très précieuse , j'ai très bien compris !

    Sinon je ne saurait pas te dire pour l'OS et le compilateur , je bosse sur le code en aval via un coutil web affichant le code des blocs ... j'ai même pas accès à la data division

    En tout cas merci encore

  4. #4
    Expert éminent sénior
    Citation Envoyé par Hédhili Jaïdane Voir le message
    Maintenant, si le fichier est vide, à l'OPEN on peut tester le statut du fichier pour le savoir. Si on ne le fait pas, l'indicateur de "disponibilité d'un enregistrement suivant" est mis à "false" et le traitement continue.
    Bonjour,

    Il y a coquille : la fin de fichier, représentée par la valeur de File-Status 10, n'est pas détectée à l'ouverture, mais seulement lors de la lecture
    Pour un fichier vide c'est donc la 1ère lecture qui renverra cette valeur de file-status.

  5. #5
    Expert confirmé
    Bonjour.

    Il me semble l'avoir vu pour un compilo quelconque, je ne sais plus lequel mais tant pis. Au temps pour moi, tu as tout à fait raison. Mille excuses pour cette erreur.

###raw>template_hook.ano_emploi###