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

  • Thread starter Thread starter Franzy
  • Start date Start date
  • Tags Tags
    File Fortran
Click For Summary
SUMMARY

This discussion focuses on reading binary data from a memory-mapped file using Fortran, specifically addressing the challenges faced by users familiar with Delphi and C. The user successfully opened the virtual file using OpenFileMapping and created a view with MapViewOfFile, but needed guidance on reading bytes into variables and performing pointer arithmetic. The solution involves using the WinAPI function CopyMemory alongside Fortran's loc function for pointer manipulation.

PREREQUISITES
  • Understanding of Fortran programming language
  • Familiarity with Windows API functions such as OpenFileMapping and MapViewOfFile
  • Knowledge of binary data representation (integers and doubles)
  • Experience with pointer arithmetic in programming
NEXT STEPS
  • Learn how to use the Fortran loc function for pointer arithmetic
  • Research the WinAPI function CopyMemory for efficient memory copying
  • Explore Fortran's interoperability with C for advanced memory management
  • Study memory-mapped file concepts and their applications in Fortran
USEFUL FOR

This discussion is beneficial for Fortran developers, particularly those working with memory-mapped files, as well as programmers transitioning from Delphi or C who need to adapt their knowledge to Fortran's syntax and memory management techniques.

Franzy
Messages
2
Reaction score
0
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:
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
 
Technology news on Phys.org
I think I got it. I just have to use WinApi function CopyMemory and fortran loc function in pointer arithmetics.
 
I tried a web search "the loss of programming ", and found an article saying that all aspects of writing, developing, and testing software programs will one day all be handled through artificial intelligence. One must wonder then, who is responsible. WHO is responsible for any problems, bugs, deficiencies, or whatever malfunctions which the programs make their users endure? Things may work wrong however the "wrong" happens. AI needs to fix the problems for the users. Any way to...

Similar threads

  • · Replies 12 ·
Replies
12
Views
3K
  • · Replies 5 ·
Replies
5
Views
5K
Replies
8
Views
2K
  • · Replies 16 ·
Replies
16
Views
3K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 12 ·
Replies
12
Views
2K
  • · Replies 1 ·
Replies
1
Views
4K
  • · Replies 2 ·
Replies
2
Views
2K