#include <stdinc.h>#include <unfio.h>int unfscan(stream instr) int unfread(stream instr, char *buf, int bufsize) int unfwrite(stream instr, char *buf, int bufsize) int unfswap(bool do_swap) int unfsize(int size) Descriptionunfio are a set of routines that allow you to (sequentially) access binary files that have been created with most FORTRAN compilers in unformatted I/O access. The datafile should have been created with an form=’unformatted’ OPEN statement. unfscan can be used to scan unformatted records, returning the size (in bytes) of the data-section of each record. End of file and various others errors are returned as 0 and some negative number resp. unfread can be used in the same way, except you give it a buffer in which the data can be stored. In good old fortran tradition you must know the largest buffer size this routine can expect to see. unfwrite is the opposite of read. The unfsize routine can be set to change the default UNFIO_HDR_SIZE header size (as determined during NEMO configure and install). Most older compilers use 4, whereas gfortran use 8. There is also suppor for 0, which means pure headerless raw data can be read this way. For example, the file created from the following snippet of code INTEGER unit,n REAL x,y(3),z(n) OPEN(unit,file=’test.dat’,form=’unformatted’) WRITE(unit) n WRITE(unit) x,y,z CLOSE(unit)can be read with the following snippet of C code:
char buf[MAXBUF]; int *ip = (int *) buf; float *fp = (float *) buf; double *dp = (double *) buf; int n; float x, y[3], z[MAXN]; instr = stropen(...,"r"); count = unfread(instr,buf,MAXBUF); if (count < 1) error("first block"); n = ip[0]; count = unfread(instr,buf,MAXBUF); if (count < 1) error("second block"); x = fp[0]; y[0] = fp[1]; y[1] = fp[2]; y[2] = fp[3]; for (i=0; i<n; i++) z[i] = fp[4+i]; strclose(instr);
struct block { int size; char buf[size]; int size; } block
Access is sequential. If the user keeps a record of the file pointer, and knows the low level filestructure is that of block described above, a call to fseek(3) can in principle be used to re-read previous blocks.
~/src/fortran/ unfio.c
xx-may-94 V1.0 Created for prun PJT 8-aug-95 V1.1 added support for swap for NBODY5 (u3tos) PJT 1-mar-06 V1.2 added unfsize for gfortran PJT 4-mar-06 V1.3 use a default UNFIO_HDR_SIZE for hdr_size PJT 8-may-08 V1.4 support raw header=0 data PJT 25-feb-09 V1.5 add non-swapping version of unfwrite PJT