尝试使用 Fortran 程序读取用 c 编写的二进制文件

问题描述 投票:0回答:1

看起来这是一个经过充分讨论的问题。但我发现的讨论仍然没有帮助。

因此,有一个可以生成临时二进制文件的软件。每个数据都是一个大矩阵(5568;5568)。据我了解,它将它们保存在 float 32 中。

现在我需要查看其中一些二进制文件中的内容,因此用 Fortran90 编写一个程序,因为这对我来说更容易。但我所做的,不起作用!!

辅助模块里面的内容并不重要,它只是读取设置并构建要打开的好文件名。 我认为用于按值读取二进制文件值的变量类型很重要,但显然不是,因为我将“R_VAL”定义为单精度或双精度(甚至是整数),并且它总是在我完成之前停止填满我的桌子,这不好。

我的 READ 或 OPEN 有问题,但我找不到问题所在。

谢谢。

这是 Fortran 代码

PROGRAM MYFLOAT

    USE AUXILIARY
    IMPLICIT NONE

    CHARACTER(LEN=255) :: C255_ROOT,C255_Setup
    INTEGER :: I_TIME,I_ECH,I_LEV,I_COL,I_LIN
    INTEGER, PARAMETER :: I_WP = KIND(1.0) ! I_WP = KIND(1.0d0)
    INTEGER :: I_IOPAR=2222
    INTEGER :: I_iostat
    REAL(I_WP) :: R_VAL
    INTEGER :: I_VAL
!__________________________________________________________________________________________________
! START
    CALL GETARG(1,C255_ROOT)
    CALL GETARG(2,C255_Setup)
    ST_SAT%C255_ROOT=C255_ROOT
    PRINT*," [I] :: file will look like : "
    PRINT*,"     => ",C255_ROOT
    PRINT*," "
    PRINT*," [I] :: SETUPS IN : ",C255_Setup
    CALL AUXI_ReadSetupFile(C255_Setup)
    CALL AUXI_GetGEOsatDef(ST_SAT%I_ID)
    PRINT*," [I] :: TAB SIZE = (",ST_SAT%I_NLIN,";",ST_SAT%I_NCOL,";",ST_SAT%I_NLEV,")"
    DO I_TIME=1,ST_SAT%I_NTIME
        DO I_ECH=1,ST_SAT%I_NECH
            ALLOCATE(ST_SAT%RT3_MyVar(ST_SAT%I_NLIN,ST_SAT%I_NCOL,ST_SAT%I_NLEV))
            DO I_LEV=1,ST_SAT%I_NLEV
                CALL AUXI_SetInputFilename(I_TIME,I_ECH,I_LEV)
                PRINT*," [I] :: Reading Filename : ",ST_SAT%C255_InputFile    
                OPEN(UNIT=I_IOPAR,              &
                    FILE=ST_SAT%C255_InputFile, &
                    FORM="unformatted",  &
                    ACCESS='STREAM', &
                    ACTION="read",       &
                    POSITION="rewind",   &
                    IOSTAT=I_iostat )
                IF(I_iostat.ne.0)STOP " =>        Problème à l'ouverture" 
                DO I_COL=1,ST_SAT%I_NCOL
                    DO I_LIN=1,ST_SAT%I_NLIN                        
                        READ(I_IOPAR,IOSTAT=I_iostat) R_VAL 
                        IF(I_iostat.ne.0)THEN 
                            PRINT*," [T] :: I_LIN= ",I_LIN
                            PRINT*," [T] :: I_COL= ",I_COL
                            STOP " => MISSING VALUES IN MATRIX ! "
                        ENDIF
                         ST_SAT%RT3_MyVar(I_LIN,I_COL,I_LEV)=R_VAL
                    ENDDO
                ENDDO
                CLOSE(I_IOPAR)  
            ENDDO
            DEALLOCATE(ST_SAT%RT3_MyVar)
        ENDDO
    ENDDO




!__________________________________________________________________________________________________
! END
ENDPROGRAM MYFLOAT
``
the console output ::                                                                                   
  [T] :: I_LIN=         3713
  [T] :: I_COL=          155
STOP  => MISSING VALUES IN MATRIX !
c fortran
1个回答
0
投票

以我的愚见,需要用 C 和 Fortran 代码编写一个最小工作示例并附加结果数据文件。以及打印文件中的每个值。

© www.soinside.com 2019 - 2024. All rights reserved.