2017-03-06 10 views
0

OpenVMS에서 작성된 색인 파일을 Windows 또는 Linux에서 사용되는 일반 평면 순차 파일로 변환하려고했습니다. 각 인덱스 파일은 내가 이와 같은 간단한 프로그램을 사용하여 파일을 변환 한OpenVMS에서 RMS 색인 파일 변환/변환

POD 구조 (2594 바이트)의 X 수량이 포함되어

PROGRAM  MAKE_FLAT 
    BYTE  byte_array(2594) 
    PARAMETER FILE_IN = 1 
    PARAMETER FILE_OUT = 2 

    OPEN(UNIT=FILE_IN, fmt='UNFORMATTED', 
    1 FILE='input.data', 
    1 ORGANIZATION='INDEXED', 
    1 ACCESS='SEQUENTIAL', 
    1 KEY=(1:8:INTEGER), RECL=649) 
    OPEN(UNIT=FILE_OUT, fmt='UNFORMATTED', 
    1 FILE='output.data') 

    DO WHILE (.TRUE.) 
     READ(FILE_IN, END=999) byte_array 
     WRITE(FILE_OUT) byte_array 
    END DO 
999 CONTINUE 
    CLOSE(FILE_IN) 
    CLOSE(FILE_OUT) 
    END 

파일에 1000 개 개의 레코드가있는 경우, 그리고 ~ 1000 * 2594 바이트 파일을 기대하지만, 대신 사용하여 1000 * 2044 바이트로 표시 결과를해야합니다

DIR/FULL output.data 

이 왜이 프로그램이 레코드 당 더 적은 바이트를 쓰고 있는지? 내가 뭐 잘못 했어요?

편집 : 내장 된 OpenVMS 유틸리티를 사용하면 예상되는 플랫 파일을 얻을 수 있습니다.

ANAL/RMS/FDL FILE.FDL input.data 
EDIT/FDL/ANALY=FILE.FDL FILE.FDL 

'순차'에 'INDEXED'와 'YES', 다음 명령을 수행하는 나에게 맞는 크기의 플랫 파일을 제공하는 연속에서 조직을 변경 한 후 (레코드 당 패딩을 포함한다).

CONVERT/FDL=FILE.FDL input.data output.data 
+0

왜이 태그가 C++입니까? –

+0

RECL을 명시 적으로 입력해서는 안됩니다. 값은 컴파일러간에 호환되지 않습니다. 대신 '문의'를 사용해야합니다. http://stackoverflow.com/questions/32686720/reading-writing-fortran-direct-access-unformatted-files-with-different-compilers –

+2

649 * 4가 2594가 아니라 2596임을 알았습니다. 각 레코드는 중간에 포기하지 않고 짧다고 생각하십니까? 프로그램 끝에서 읽고 쓰는 레코드 수를 인쇄합니다. –

답변

0

2044는 max. 레코드 크기 VMS의 FORTRAN이 데이터를 쓰는 데 사용하고 있습니다. 파일 크기가 실제로 1000 * 2044 일 경우 뭔가 잘못되었습니다.

'레코드 크기', '파일 블록 끝'및 '파일 끝 바이트'줄에 DUMP/HEADER/BLOCKS=COUNT=0 FOR002.DAT의 출력 내용은 무엇입니까?

나는 2594 바이트가 두 개의 레코드로 기록 될 것으로 기대한다. 플래그에 대해 2 바이트가 있으면 2044 및 554 길이의 레코드를 볼 수 있습니다 (DUMP/RECORD FOR002.DAT/PAGE으로 확인할 수 있습니다). 각 레코드의 레코드 길이 필드는 2 바이트입니다. 즉, 파일 크기가 1000 * (2044 + 2 + 554 + 2) = 2602000이어야합니다.

첫 번째 덤프 명령의 "파일 끝"데이터로 다시 확인할 수 있습니다. 파일 블록 -1) * 512 + 파일 끝 바이트.

+0

출력 파일은 'UNFORMATTED'와 같이 열립니다. 즉, VMS Fortran은 VFC (고정 제어가있는 변수) 레코드 유형으로 파일을 작성합니다. 각 레코드는 2 바이트 길이와 2 바이트 플래그 필드를 가지며, 그 중 플래그의 2 비트만으로 실제 레코드가 첫 번째인지, 마지막 레코드인지 또는 둘 다 논리적 레코드인지 여부를 나타냅니다. –

0

당신이 정말로, 프로그램에서이 작업을 수행 할 필요가없는 경우 단지

$ CONVERT/FDL=FIXED.FDL IN-FILE OUT-FILE 

당신은 $ EDIT/FDL FIXED.FDL을 사용하고 순차 파일을 만들기위한 지시를 따를 수 CONVERT 사용합니다.