我不明白fortran中未格式化文件的格式。
例如:
open (3,file=filename,form="unformatted",access="sequential")
write(3) matrix(i,:)
将矩阵列输出到文件中。我发现它在两端填充了4个字节的文件,但是我真的不明白为什么,或者如何控制这种行为。有没有办法删除填充?
由于
答案 0 :(得分:20)
对于未格式化的IO,Fortran编译器通常在记录的开头和结尾写入记录的长度。大多数但不是所有编译器都使用四个字节。这有助于读取记录,例如,最后的长度有助于退格操作。您可以使用Fortran 2003的新Stream IO模式来抑制此问题,该模式是为了与其他语言兼容而添加的。在open语句中使用 access ='stream'。
答案 1 :(得分:6)
出于这个原因,我从未使用无格式输出的顺序访问。但是它取决于应用程序,有时候有一个记录长度指示器(特别是非结构化数据)很方便。正如Looking at binary output from fortran on gnuplot中的steabert所建议的那样,您可以通过使用关键字参数ACCESS = 'DIRECT'
来避免这种情况,在这种情况下,您需要指定记录长度。该方法便于有效存储大型多维结构化数据(恒定记录长度)。下面的示例写入一个大小等于数组大小的无格式文件:
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
请注意,从可移植性的角度来看,这不是理想的方法。在使用直接访问编写的无格式文件中,没有关于每个元素大小的信息。描述数据大小的自述文本文件对我来说工作正常,我更喜欢这种方法而不是顺序模式中的填充。
答案 2 :(得分:5)
Fortran IO是基于记录的,而不是基于流的。每次通过write()
写一些内容时,您不仅要编写数据,还要编写该记录的开始和结束标记。两个记录标记都是该记录的大小。这就是为什么在一次写入中写入一堆实数(一个记录:一个开始标记,一堆实数,一个结束标记)具有不同的大小,相对于在单独的写入中写入每个实数(多个记录,每个一个开始标记,一个真实标记和一个结束标记。如果你写下大型矩阵,这是非常重要的,因为如果写得不正确,你可能会占据职业。
答案 3 :(得分:1)
Fortran Unformatted IO我非常熟悉使用Intel和Gnu编译器的不同输出。幸运的是,我可以追溯到1970年代的IBM经历让我能够解码事物。 Gnu使用4字节整数计数器填充记录,给出记录长度。英特尔使用1字节计数器和许多嵌入式编码值来表示延续记录或计数结束。即使只使用1个字节,仍然可以有很长的记录长度。 我有由Gnu编译器编译的软件,我必须修改它,因此它可以读取由任一编译器生成的无格式文件,因此它必须检测它找到的格式。读取英特尔编译器生成的未格式化文件(遵循"旧的' IBM时代)需要"永远"使用Gnu的fgetc或以流模式打开文件。将文件转换为Gnu预期的结果可以使事件的速度提高100倍。如果您想打扰检测和转换,这取决于您的文件大小。我将程序启动时间(打开一个大的未格式化文件)从5分钟减少到10秒。如果用户想要将文件带回英特尔编译程序,我必须添加选项以再次重新转换。这一切都很痛苦,但你去了。