3

我的问题是,给定我从文件中读取的变量,查看它是否包含或匹配另一个字符串。

换句话说,在一个文件中查找其变量的所有记录

布拉德 PIC X(30)

匹配或包含由键盘引入的字符串。

我非常有信心通过 INSPECT 指令解决了这个问题,并且我在我的代码中尝试了这样的事情:

           READ BRANCHFILE NEXT RECORD 
             AT END SET EndOfFile TO TRUE
           END-READ.
           PERFORM UNTIL EndOfFile
               INSPECT BBRADD 
                 TALLYING CONT for CHARACTERS
                   BEFORE INITIAL CITY
               IF CONT>1
                   DISPLAY " BRANCH CODE    :" BBRID
                   DISPLAY " BRANCH NAME    :" BBRNAME
                   DISPLAY " BRANCH ADDRESS :" BBRADD
                   DISPLAY " PHONE          :" BBRPH
                   DISPLAY " E-MAIL         :" BEMAIL
                   DISPLAY " MANAGER NAME   :" BMGRNAME
                   DISPLAY " ------------------"
                   DISPLAY " ------------------"
               END-IF
               READ BRANCHFILE NEXT RECORD 
                   AT END SET EndOfFile TO TRUE
               END-READ
               MOVE 0 TO CONT
           END-PERFORM.

其中 CITY 是我通过键盘引入的变量。

¿ 有人知道如何在“字符串”中找到“子字符串”吗?

例如,如果我介绍了“Zaragoza”,我的程序必须打印文件中变量 BBRADD 包含“Zaragoza”的所有记录。

01 BRANCHREC. 
   88 EndOfFile VALUE HIGH-VALUE. 
   02 BBRID PIC X(6). 
   02 BBRNAME PIC X(15). 
   02 BBRADD PIC X(30). 
   02 BBRPH PIC X(10). 
   02 BEMAIL PIC X(20). 
   02 BMGRNAME PIC X(25). 
4

1 回答 1

2

每次都需要在 INSPECT 之前将 CONT 设置为零。

当 INSPECT 开始时,CONT 只是从其初始值更新。在您找到第一个记录后,每条记录看起来都包含 CITY。

If 最初可能看起来很奇怪,它以这种方式工作,但如果不是这样,你会在你希望它如何工作的情况下受到限制。

啊,再靠近一点,您正在将 CONT 设置为初始值,您只是在一个意想不到的地方这样做。如果它需要为零,请在它应该为零之前立即将其设置为零。更容易找到,对于将来更改程序的人来说更不容易弄得一团糟。

但是,您还有另一个问题。假设 CITY 是 PIC X(20)。用户输入 SEVILLA,您的 INSPECT 现在将搜索 SEVILLA,后跟 13 个空格。理想情况下,您希望 SEVILLA 后跟一个空格。

您需要能够测试用户输入的值,尾随空白,但不能更多。

当前流行的方法是使用参考修改。

您需要接受用户输入,找出它包含多少尾随空格,计算数据的长度,为尾随空白添加一个,并将该值保存在一个字段中(最好是 BINARY 字段)。

然后你的 INSPECT 看起来像这样:

           INSPECT BBRADD 
             TALLYING CONT for CHARACTERS
               BEFORE INITIAL CITY ( 1 : length-of-data-plus-one )

但是,如果塞维利亚实际上处于该领域的起点,那么您就会遇到问题。

所以你做了一个小改动,不是计算它之前出现的字符,而是计算它的出现次数。

           INSPECT BBRADD 
             TALLYING CONT for ALL
                           CITY ( 1 : length-of-data-plus-one )

许多人会改为编写带有引用修改的 PERFORM 循环并以这种方式进行测试。对于上述 INSPECT 的最终版本,您必须自己编写终止逻辑。出于学习目的,最好双管齐下。

执行 file-io 时,请始终使用并检查 FILE STATUS。将您的 READ 放入一个段落并执行它,您不需要两段不同的代码。如果您使用 FILE STATUS,则不需要 AT END(或 END-READ),因为用于接收 FILE STATUS 值的字段将是“10”表示文件结束。只需在该字段上使用您的 88,值为“10”。

您问题的编辑现在指示您现有的 88 级在哪里。

一方面,这是一个好主意,因为文件结尾与记录相关联,不可能有有效的意外内容。

另一方面,这不是一个“可移植”的解决方案:如果您使用其他 COBOL,您可能会发现一旦到达文件末尾,就不再有效地访问FD. 在标准中没有定义在这种情况下发生的事情,因此您会发现编译器之间的差异。

您可以保留组项目上的 88 并通过使用READ ... INTO ...记录布局将其移植到WORKING-STORAGE. 这需要稍长的时间来执行,因为数据必须从一个位置传输到另一个位置。

我更喜欢 FILE STATUS 字段上的 88 并通过删除和来简化AT ENDREAD END-READ。我已经无法访问 FD 下的记录区域,所以我不会意外得到看起来不错的错误值。

于 2014-10-13T23:12:10.317 回答