我的问题是,给定一个从文件中读取的变量,看看它是否包含或匹配另一个字符串。
换句话说,在文件中查找其变量的所有记录
BRADD PIC X(30)
匹配或包含由键盘引入的字符串。
我很有信心通过检查指令解决了这个问题,我在代码中尝试过这样的方法:
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.城市是我通过键盘引入的变量。
有人知道如何在“字符串”中找到“子字符串”吗?
例如,如果我引入了“萨拉戈萨”,我的程序就必须打印BBRADD变量包含“萨拉戈萨”的文件中的所有记录。
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). 发布于 2014-10-13 23:12:10
每次检查前,您都需要将连续设置为零。
当检查开始时,CONT只从它的初始值得到更新。当你找到你的第一张唱片后,每一张唱片都会看起来像是有城市。
如果梅最初看起来很奇怪,它的工作方式,但如果没有,你会受到限制的时候,这是你希望它的工作方式。
啊,再往前看,你正在设定一个初值,你只是在一个意想不到的地方这样做。如果需要为零,请在应该为零之前立即将其设置为零。找起来容易得多,对将来改变程序的人来说就不太容易弄得一团糟。
然而,你还有另一个问题。假设城市是PIC X(20)。用户进入塞维利亚,你的检查将搜索塞维利亚,然后是13个空格。理想情况下,你会希望塞维利亚后面有一个空间。
您需要能够测试用户输入的值,但不能使用拖尾空白,但不能更多。
目前流行的方法是参考修改。
您需要接受您的用户输入,找出它包含多少尾随空格,计算数据的长度,为后面的空白添加一个,并将该值保存在字段中(最好是二进制字段)。
那么您的检查可以如下所示:
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 )许多人会用引用修改来编写执行循环,并以这种方式进行测试。使用上面检查的最终版本,必须自己编写终止逻辑。为了学习的目的,最好两种方式都这样做。
执行文件时,请始终使用并检查文件状态.把你的阅读放入一个段落并执行它,你不需要两段不同的代码。如果使用文件状态,则不需要AT END (或END-READ),因为用于接收文件状态值的字段对于文件结束时为"10“。只需使用您的88在该领域,价值"10“。
您的问题上的编辑现在指示您的现有88级在哪里。
一方面,这是一个好主意,因为文件的结尾与记录相关联,而且不可能有有效的意外内容。
另一方面,这不是一个“可移植”的解决方案:如果您使用其他COBOL,您可能会发现,一旦到达文件结束,访问FD下的数据就不再有效。在标准中,没有定义在这种情况下发生的事情,所以编译器之间存在差异。
如果使用READ ... INTO ...并将记录布局放在WORKING-STORAGE中,则可以保留组项上的88,让它具有可移植性。这需要稍长的时间来执行,因为数据必须从一个位置传输到另一个位置。
我更喜欢文件状态字段中的88,并通过能够删除AT END和END-READ来简化读取。我已经无法访问FD下的记录区域,所以我不会意外地得到看起来很好的错误值。
https://stackoverflow.com/questions/26349747
复制相似问题