2017-03-06 51 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」到「SEQUENTIAL」和鄰接的爲「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是2596而不是2594.另外,是什麼讓你認爲每個記錄都很短,而不是你放棄了一半?我會打印在程序結束時讀取/寫入的記錄數。 –

回答

0

2044看起來像最大。 VMS上的記錄大小FORTRAN正用於寫入數據。如果文件大小真的是1000 * 2044,則說明有問題。

DUMP/HEADER/BLOCKS=COUNT=0 FOR002.DAT在'Record size','End of file block'和'End of file byte'中的輸出是什麼?

我期望2594字節寫入兩個記錄。鑑於某個標誌有兩個字節,您將看到長度爲2044和554的記錄(可以用DUMP/RECORD FOR002.DAT/PAGE確認。)每條記錄都有一個兩字節的記錄長度字段。也就是說,你應該有一個文件大小爲1000 *(2044 + 2 + 554 + 2)= 2602000.

您可以仔細檢查第一個DUMP命令中的「文件結束」數據:文件塊-1)* 512 +文件字節結束。

+0

輸出文件的打開方式與「UNFORMATTED」相同,這意味着VMS Fortran使用VFC(具有固定控件的變量)記錄類型寫入文件。每個記錄具有兩個字節的長度和一個兩個字節的標誌字段,其中標誌中只有兩個位用於指示物理記錄是邏輯記錄的第一個還是最後一個還是兩個都不是。 –

0

如果你並不真的需要做到這一點的一個程序,只要使用CONVERT

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

您可以使用$編輯/ FDL FIXED.FDL並按照提示製作順序文件。