저는 COBOL 프로그래밍을 배우고 GNUCobol (Linux)을 사용하여 간단한 프로그램을 컴파일하고 테스트합니다. 이러한 프로그램 중 하나에서 나는 이해할 수없는 예기치 않은 행동을 발견했습니다. 연속 된 레코드 파일을 읽을 때 나는 항상 하나의 추가 레코드를 얻고 이러한 레코드를 보고서에 쓰면 마지막 레코드가 복제됩니다.GNUCobol 컴파일 된 프로그램이 예상보다 1 건 많은 것으로 계산됩니다.
이 동작을 재현하는 매우 간단한 프로그램을 만들었습니다. 이 경우 텍스트 한 줄 ("")이있는 텍스트 파일이 있습니다. 프로그램은 파일 (또는 문자가 긴 문자 1 개)의 문자를 계산해야하며 결과로 "10"을 표시하려고하지만 대신 "11"을 얻습니다. 또한
, 기록, 그들이 읽은대로, 나는 다음과 같은 출력을 얻을 표시 할 때 :
0
1
2
3
4
5
6
7
8
9
11
(9와 11 사이에 두 개의 빈 공간이있다)를.
이 관련이 프로그램의 일부입니다 : 내가 컴파일러에 대한 기본 옵션을 사용하고
FD SIMPLE.
01 SIMPLE-RECORD.
05 SMP-NUMBER PIC 9(1).
[...]
PROCEDURE DIVISION.
000-COUNT-RECORDS.
OPEN INPUT SIMPLE.
PERFORM UNTIL SIMPLE-EOF
READ SIMPLE
AT END
SET SIMPLE-EOF TO TRUE
NOT AT END
DISPLAY SMP-NUMBER
ADD 1 TO RECORD-COUNT
END-READ
END-PERFORM
DISPLAY RECORD-COUNT.
CLOSE SIMPLE.
STOP RUN.
, 나는 사용하여 시도했다 'TEST와 함께 {BEFORE | AFTER}'하지만 결과는이다 같은. 이 문제의 원인은 무엇이겠습니까? 또는 예상되는 결과를 얻으려면 어떻게해야합니까?
편집 : 나는 파일을 비워 두 가지 방법을 사용하여 0 레코드 개수를 기대하고, 데이터 소스로 "빈"파일을 사용하여 시도 :
$ echo "" > SIMPLE
레코드 개수가 1 (LS 산전이 방법 - l는 파일에 대해 1 바이트의 크기를 제공합니다).
$ rm SIMPLE
$ touch SIMPLE
이렇게하면 레코드 수는 0입니다 (ls -l은 파일의 크기가 0입니다). 그래서 나는 어떻게 든 컴파일 된 프로그램이 여분의 문자를 감지하고 있다고 생각하지만 이것을 피하는 방법을 모른다.
파일에 개행 문자가 있습니까? – ninjalj
아마도 11 번째 문자로 줄 끝 문자를 읽는 것 같습니다. 읽는 동안 각 문자를 인쇄하면 알 수 있습니다. – geert3
참고 : GnuCOBOL을 사용할 때'PERFORM FOREVER' 또는'PERFORM UNTIL EXIT'을 사용하고'AT END' 절에서'EXIT PERFORM'을 수행 할 것을 권장합니다. –