Copyright (C) 2000-2012 |
GNU Info (g77-300.info)Portable Unformatted FilesPortable Unformatted Files -------------------------- `g77' has no facility for exchanging unformatted files with systems using different number formats--even differing only in endianness (byte order)--or written by other compilers. Some compilers provide facilities at least for doing byte-swapping during unformatted I/O. It is unrealistic to expect to cope with exchanging unformatted files with arbitrary other compiler runtimes, but the `g77' runtime should at least be able to read files written by `g77' on systems with different number formats, particularly if they differ only in byte order. In case you do need to write a program to translate to or from `g77' (`libf2c') unformatted files, they are written as follows: Sequential Unformatted sequential records consist of 1. A number giving the length of the record contents; 2. the length of record contents again (for backspace). The record length is of C type `long'; this means that it is 8 bytes on 64-bit systems such as Alpha GNU/Linux and 4 bytes on other systems, such as x86 GNU/Linux. Consequently such files cannot be exchanged between 64-bit and 32-bit systems, even with the same basic number format. Direct access Unformatted direct access files form a byte stream of length RECORDS*RECL bytes, where RECORDS is the maximum record number (`REC=RECORDS') written and RECL is the record length in bytes specified in the `OPEN' statement (`RECL=RECL'). Data appear in the records as determined by the relevant `WRITE' statement. Dummy records with arbitrary contents appear in the file in place of records which haven't been written. Thus for exchanging a sequential or direct access unformatted file between big- and little-endian 32-bit systems using IEEE 754 floating point it would be sufficient to reverse the bytes in consecutive words in the file if, and _only_ if, only `REAL*4', `COMPLEX', `INTEGER*4' and/or `LOGICAL*4' data have been written to it by `g77'. If necessary, it is possible to do byte-oriented i/o with `g77''s `FGETC' and `FPUTC' intrinsics. Byte-swapping can be done in Fortran by equivalencing larger sized variables to an `INTEGER*1' array or a set of scalars. If you need to exchange binary data between arbitrary system and compiler variations, we recommend using a portable binary format with Fortran bindings, such as NCSA's HDF (`http://hdf.ncsa.uiuc.edu/') or PACT's PDB(1) (`http://www.llnl.gov/def_sci/pact/pact_homepage.html'). (Unlike, say, CDF or XDR, HDF-like systems write in the native number formats and only incur overhead when they are read on a system with a different format.) A future `g77' runtime library should use such techniques. ---------- Footnotes ---------- (1) No, not _that_ one. automatically generated by info2www version 1.2.2.9 |