Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Fortran: how do you read from a memory-mapped file?

  1. Apr 7, 2009 #1
    Hello everyone!

    I have some binary data (list of integer and float values) stored in a memory-mapped file. I need to read this data. I know how to do this in Delphi and C, but Fortran completely stalled me. So far I managed to open my virtual file (OpenFileMapping) and create a mapview (MapViewOfFile). I believe I have a pointer to the starting byte :) But how do I read, say, first 4 bytes and turn them into an integer value? And then next 8 bytes and turn them into double float? In Delphi, I use move procedure for this. You just give it a pointer to the source, a pointer to the destination and a number of bytes to read - works like a charm.
    So, 1) how to read bytes and write them into variables? 2) how to perform pointer arithmetics in Fortran (for example, to move pointer X bytes forward in address space)?

    Here is the listing of my subroutine (it's a dll, btw):

    Code (Text):

    function FSReadGridData
     ! Func returns error code, 0 for success
     
     !DEC$ ATTRIBUTES DLLEXPORT::FSReadGridData

     USE sizeconstants
     USE Kernel32, ONLY: OpenFileMapping, MapViewOfFile  

     ! Variables

      Implicit NONE
     !---------------------------------
      Integer(4)      :: FSReadGridData
     !---------------------------------
       
      Character(LEN=63)           :: MapName
      Byte, Pointer                   :: GM_start, GM_caret
      Integer(SHANDLE)            :: GeometryMH   ! SHANDLE =4 for Win32
     
      Integer(4), Dimension(1:10) ::  test1 ! arrays to store test data from memory file
      Real(8), Dimension(1:10) ::  test2


     !=============================

      MapName = 'PKSigma_Grid_Map'//CHAR(0) ! We need a null-terminated string

      GeometryMH = OpenFileMapping(FILE_MAP_READ,.FALSE.,MapName)

      if (GeometryMH.EQ.0) then
        FSReadGridData =2001
        return
        ! return error code if could not open mapped file
      end if

      GM_start = MapViewOfFile(GeometryMH,FILE_MAP_READ,0,0,0);
      GM_caret = GM_start;
     
        ! GM_start holds pointer to starting byte, we 'll need it later to unmap view
        ! Using GM_caret for current location

       ! ......NOW I need to read 40 bytes from GM_caret and write them to test1 array, how do I do that?!

    end function FSReadGridData
     
     
  2. jcsd
  3. Apr 7, 2009 #2
    I think I got it. I just have to use WinApi function CopyMemory and fortran loc function in pointer arithmetics.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Fortran: how do you read from a memory-mapped file?
Loading...