Fortran formato de archivo sin formato

No entiendo el formato de los archivos no formateados en fortran.

Por ejemplo:

open (3,file=filename,form="unformatted",access="sequential") write(3) matrix(i,:) 

genera una columna de una matriz en un archivo. Descubrí que rellena el archivo con 4 bytes en cada extremo, sin embargo, realmente no entiendo por qué, o cómo controlar este comportamiento. ¿Hay alguna manera de eliminar el relleno?

Gracias

Para IO no formateado, los comstackdores Fortran normalmente escriben la longitud del registro al comienzo y al final del registro. La mayoría, pero no todos, los comstackdores usan cuatro bytes. Esto ayuda a leer registros, por ejemplo, la longitud al final ayuda con una operación de retroceso. Puede suprimir esto con el nuevo modo Stream IO de Fortran 2003, que se agregó para compatibilidad con otros idiomas. Use access = ‘stream’ en su statement abierta.

Nunca usé el acceso secuencial con salida sin formato por esta razón exacta. Sin embargo, depende de la aplicación y, a veces, es conveniente tener un indicador de longitud de registro (especialmente para datos no estructurados). Según lo sugerido por steabert en Mirando la salida binaria de fortran en gnuplot , puede evitar esto usando el argumento de palabra clave ACCESS = 'DIRECT' , en cuyo caso necesita especificar la longitud del registro. Este método es conveniente para el almacenamiento eficiente de grandes datos estructurados multidimensionales (longitud de registro constante). El siguiente ejemplo escribe un archivo sin formato cuyo tamaño es igual al tamaño de la matriz:

 REAL(KIND=4),DIMENSION(10) :: a = 3.141 INTEGER :: reclen INQUIRE(iolength=reclen)a OPEN(UNIT=10,FILE='direct.out',FORM='UNFORMATTED',& ACCESS='DIRECT',RECL=reclen) WRITE(UNIT=10,REC=1)a CLOSE(UNIT=10) END 

Tenga en cuenta que este no es el enfoque ideal en cuanto a la portabilidad. En un archivo sin formato escrito con acceso directo, no hay información sobre el tamaño de cada elemento. Un archivo de texto léame que describe el tamaño de los datos me funciona bien, y prefiero este método en lugar de relleno en modo secuencial.

Fortran IO está basado en registros, no basado en la transmisión. Cada vez que escribes algo a través de write() no solo estás escribiendo los datos, sino también los marcadores iniciales y finales para ese registro. Ambos marcadores de registro son del tamaño de ese registro. Esta es la razón por la cual escribir un montón de reales en una sola escritura (un registro: un marcador de inicio, el conjunto de reales, un marcador final) tiene un tamaño diferente con respecto a escribir cada uno real en una escritura separada (registros múltiples, cada uno de un marcador de inicio, un marcador real y uno final). Esto es extremadamente importante si está anotando matrices grandes, ya que podría inflar la ocupación si no se escribe correctamente.

Fortran IO no formateado Estoy bastante familiarizado con las diferentes salidas usando los comstackdores Intel y Gnu. Afortunadamente, mi vasta experiencia que data de los años 70 de IBM me permitió decodificar las cosas. Gnu rellena registros con contadores enteros de 4 bytes dando la longitud de registro. Intel usa un contador de 1 byte y una serie de valores de encoding incrustados para indicar un registro de continuación o el final de un conteo. Todavía se pueden tener longitudes de registro muy largas aunque solo se use 1 byte. Tengo el software comstackdo por el comstackdor Gnu que tuve que modificar para que pudiera leer un archivo sin formatear generado por cualquiera de los comstackdores, por lo que tiene que detectar qué formato encuentra. Leer un archivo no formateado generado por el comstackdor Intel (que sigue a los “viejos” días de IBM) toma “para siempre” usar fgetc de Gnu o abrir el archivo en modo de flujo. Convertir el archivo a lo que Gnu espera resultados en un factor de hasta 100 veces Depende del tamaño de su archivo si desea molestarse con la detección y la conversión o no. Reduje el tiempo de inicio de mi progtwig (que abre un gran archivo sin formato) de 5 minutos a 10 segundos. Tuve que agregar opciones para reconvertir. de nuevo si el usuario quiere llevar el archivo a un progtwig comstackdo por Intel. Es todo un problema, pero ya está.

    Intereting Posts