2012-07-19 32 views
5

Tengo un archivo binario que me gustaría leer con Fortran. El problema es que no fue escrito por Fortran, por lo que no tiene los indicadores de longitud de registro. Por lo tanto, la lectura usual Fortran no formateada no funcionará.¿Puede Fortran leer los bytes directamente desde un archivo binario?

Pensé que podría ser astuto y leer el archivo como un archivo formateado, byte a byte (o 4 bytes por 4 bytes, realmente) en una matriz de caracteres y luego convertir el contenido de los caracteres en enteros y flotantes a través de la función de transferencia o la temida declaración de equivalencia. Pero esto no funciona: trato de leer 4 bytes a la vez y, de acuerdo con la salida POS de la declaración inquire, la lectura salta más o menos como 6000 bytes, y la matriz de caracteres se carga con basura.

Así que eso es un no ir. ¿Hay algún detalle en este enfoque que estoy olvidando? ¿O hay una forma fundamentalmente diferente y mejor de hacer esto en Fortran? (Por cierto, también intenté leer en una matriz integer*1 y una matriz de bytes. Aunque estos códigos se compilarían, cuando se trataba de la instrucción read, el código se bloqueaba.)

Respuesta

8

Sí.

Fortran 2003 introdujo el acceso a la secuencia en el idioma. Antes de esto, la mayoría de los procesadores soportaban algo equivalente a una extensión, quizás llamada "binaria" o similar.

El acceso a la transmisión no formateada no impone ninguna estructura de registro en el archivo. A modo de ejemplo, para leer los datos desde el archivo que corresponde a un único int en el procesador compañera C (si lo hay) para un procesador Fortran en particular:

USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT 
INTEGER, PARAMETER :: unit = 10 
CHARACTER(*), PARAMETER :: filename = 'name of your file' 
INTEGER(C_INT) :: data 
!*** 
OPEN(unit, filename, ACCESS='STREAM', FORM='UNFORMATTED') 
READ (unit) data 
CLOSE(unit) 
PRINT "('data was ',I0)", data 

es posible que tenga problemas con endianess y tamaño de tipo de datos, pero esos aspectos son independientes del lenguaje.

Si está escribiendo en un estándar de idioma anterior a Fortran 2003, entonces puede funcionar la lectura de acceso directo sin formato en una variable entera adecuada: es específico del procesador Fortran pero funciona para muchos de los procesadores actuales.

+0

Funciona muy bien! ¡Gracias! Y pensé que estaba a punto de ser bueno con FORTRAN 90. ¡Y ahora más para aprender! Ah bueno. Muchas gracias. –

+1

Sin el acceso de "transmisión", la lectura de Fortran interpretaba algunos datos como información de longitud de registro. Que saltó datos que deseaba leer y causó que las longitudes de registro fueran incorrectas. Además, el archivo realmente no tiene registros en el sentido Fortran. –

+0

@ M.S.B .: Si, como indica el OP, primero intentó con la lectura formateada, supongo que escaneó hacia delante hasta que tocó un carácter de nueva línea. – janneb

Cuestiones relacionadas