COBOL:简单的文件读取问题
我有一个非常基本的COBOL程序,它读取一个文件COBOL:简单的文件读取问题,cobol,gnucobol,Cobol,Gnucobol,我有一个非常基本的COBOL程序,它读取一个文件input.dat,然后在控制台中简单地输出它。input.dat文件如下所示: John Johnson Peter Peterson Juliette Julietteson Natasha Natashason Justin J
input.dat
,然后在控制台中简单地输出它。input.dat
文件如下所示:
John Johnson
Peter Peterson
Juliette Julietteson
Natasha Natashason
Justin Justinson
John Johnson
Peter Peterson
Juliette Julietteson
Natasha Natashason
Justin Justinson
ustin Justinson
此处显示不正确,但我确信名字有20个字符
,姓氏有20个字符
这是我的COBOL程序:
IDENTIFICATION DIVISION.
PROGRAM-ID. ATEST4.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUTFILE ASSIGN TO "files/input.dat".
DATA DIVISION.
FILE SECTION.
FD INPUTFILE
LABEL RECORDS ARE OMITTED.
01 INPUTRECORD PIC X(40).
WORKING-STORAGE SECTION.
01 FILE-STATUS PIC 9 VALUE 0.
PROCEDURE DIVISION.
001-MAIN.
OPEN INPUT INPUTFILE.
PERFORM 002-READ UNTIL FILE-STATUS = 1.
CLOSE INPUTFILE.
STOP RUN.
002-READ.
READ INPUTFILE
AT END MOVE 1 TO FILE-STATUS
NOT AT END DISPLAY INPUTRECORD
END-READ.
相反,输出如下所示:
John Johnson
Peter Peterson
Juliette Julietteson
Natasha Natashason
Justin Justinson
John Johnson
Peter Peterson
Juliette Julietteson
Natasha Natashason
Justin Justinson
ustin Justinson
最后一行似乎是前一行的副本,缺少第一个字符和几个较少的尾随空格(总计为35个字符
)
为什么会发生这种情况?这似乎是对末尾的子句的误解,但我无法回避
编辑:根据建议更新编译器。还是一样的结果。
这里是我的链接,如果有帮助的话好的,错过了一个技巧。一两个。您正在使用40字节的固定长度记录。当您使用固定长度的记录时,与行顺序记录不同,读取时不存在单个尾随null剥离,写入时不存在null追加
我还粘贴了问题中的数据,它以40字节记录(包括空记录分隔符)的形式到达我的面前
现在我有了你的真实数据
不是5条40字节的记录,而是5条41字节的记录。如果你认为这是一组数据,COBOL程序一次读取40个字节,那就给你五个40字节的记录,一个是五。
如果不向记录追加null,我应该将所有输出数据视为一条长线。但我没有。为什么?
这一次,对于“long”记录,除第一条记录外,所有记录上都有null的前导记录分隔符
以下是一些数据供您测试:
John Johnson 0123456789
Peter Peterson 0123456789
Juliette Julietteson123456789
Natasha Natashason0123456789
Justin Justinson 0123456789
1234511111111111111111111111111111111110
这意味着每个记录有40字节的数据,后跟一个空记录终止符
这是您修改后的程序,用于编译和运行数据。我使用了`cobc-x-free prog.cob,而不是在粘贴问题后修复列(从SO粘贴对COBOL来说并不好)。而且因为它被破坏了,所以我没有太多注意我把新东西塞进了什么地方
“>”的要点和“我不熟悉opencobol,但我记得的cobol写入从工作存储中获取了,而不是输入文件描述。@GilbertLeBlanc我也使用了这种方法,但输出是same@GilbertLeBlanc我还删除了写入部分,输出到控制台会产生相同的结果。。也许我需要在文件上添加一些EOF标记??如果您确实有OpenCOBOL,您应该升级到GnuCOBOL(OpenCOBOL的新名称)。OpenCOBOL不再作为OpenCOBOL维护,因此您有一个旧的编译器。如果您得到的是这个结果,那么您所显示的代码(最新编辑,第5版)就不会得到这个结果,因为它甚至不会编译。@BillWoodger我拥有cobc(OpenCOBOL)1.1.0版权(C)2001-2009 Keisuke Nishida/Roger While。想详细解释一下为什么它无法编译吗?现在更新。不同意,因为数据问题不是问题的初始条件。不同意什么?如果唯一的问题是数据,那么这个问题就离题了。因为这不是唯一的问题,问题是关于主题的。或者你是说数据是正常的,在这种情况下,问题不能用GnuCOBOL重现。我是说程序所期望的数据的正确结构在主题上。即使逻辑正确,我也输入了一种意想不到的格式。如果你必须的话,解释为什么它不属于编程网站。如果你把测试日期搞砸了,你应该能够自己解决。它不会帮助任何其他人(他们不会有你的数据)。修复数据,没有编程问题。这和打字错误是一样的。如果你想确认这一点(当然,我可能错了),你可以在元站点上提问(从你的个人资料中,选择元图标)。我以前曾投票结束关于数据输入错误的问题。我希望,如果您的数据显示完全混乱,您会查看您的文件并修复错误。只是在这种情况下,似乎发生了一些错误。我们的想法不同,仅此而已。另一方面:我对另一个答案投了反对票,因为它的质量很差,没有别的。仅仅发布代码对任何人都没有帮助,特别是如果更改看起来微不足道,并且你没有解释为什么要重新发布代码(例如,你对88个值的评论所包含的信息要比他的答案多得多)。