2017-12-17 10 views
1

저는 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입니다). 그래서 나는 어떻게 든 컴파일 된 프로그램이 여분의 문자를 감지하고 있다고 생각하지만 이것을 피하는 방법을 모른다.

+0

파일에 개행 문자가 있습니까? – ninjalj

+1

아마도 11 번째 문자로 줄 끝 문자를 읽는 것 같습니다. 읽는 동안 각 문자를 인쇄하면 알 수 있습니다. – geert3

+0

참고 : GnuCOBOL을 사용할 때'PERFORM FOREVER' 또는'PERFORM UNTIL EXIT'을 사용하고'AT END' 절에서'EXIT PERFORM'을 수행 할 것을 권장합니다. –

답변

1

이 동작의 원인은 vim이 데이터 파일을 저장할 때 추가하는 자동 줄 바꿈 문자라는 것을 알게되었습니다.

정력에 예상대로

:set binary 
:set noeol 

프로그램이 작동이 방법이 불가능 후.

편집 : SELECT 절에 ORGANIZATION IS LINE SEQUENTIAL를 사용하는 텍스트 편집기에서 생성 된 데이터 파일로 작업 할 때이 문제를 방지하기 위해 더 우아한 방법.

데이터 형식으로 인해 문제가 발생했기 때문에이 질문을 삭제해야합니까?

+1

이 질문은 이후에 같은 문제가 발생하는 방문자에게 도움이 될 수 있으므로 삭제하지 마십시오. – rightfold