#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