||
【题记】最近准备玩玩混合语言编程,试试这水深浅,不自量力,随手翻译点小东西,准备点小玩意,还请高手大家多多指教。
Fortran的文件类型基本分为两类:FORMATTED (文本) 和 UNFORMATTED (二进制的).
二进制文件是经过压缩的,便于快速读写,但并不便于人们理解和查看。由于这种文件中存储的数据就是内存中存储的数据的完全的翻版,因此不需要经过数据转换,可以避免精度损失。
文本文件的特征恰好与此相反,但是文本文件却是人可以直接读并且编辑的,而且也有很好的兼容性。
Fortran文件中的数据被分成记录,这是可以被编程语言和运行库直接辨认的对象,也是编程语言可以识别的逻辑上的最小单元。
对于文本文件而言,用分割线分割开的记录,便于使用程序语言或者用文本编辑器来直接编辑。
而对于二进制文件来讲,必须使用特殊的字节(一般使用4-12个字节长度的)来标识记录的开始和结束,通常一个记录对应于Fortran中READ和WRITE语句中输入输出列表(I/O)中的数据。
对于顺序记录型文件,这种记录可能会有各种很不相同的长度,长度为零的记录也是被认可的。
Fortran的二进制读文件的语句READ(unit),中如果不出现变量名( I/O list ),就可以被用来跳过一条记录。同时,也可以使用 BACKSPACE语句用来向前调回一条记录。
在Fortran二进制文件中分隔符的出现使得使用其他的软件来读写标准的Fortran生成的二进制文件变成了不可能的事情,即使使用其他的在同一计算机系统中的Fortran平台去读写也不行。这种文件就是很明显的不兼容的,甚至在许多的Fortran平台下也没有很好的文档描述在二进制文件中是如何区分记录的,这就使得要用其他语言来处理这种文件更加困难。
文本文件和二进制文件都能被顺序访问或者随机访问,尽管如果使用随机访问方式的话,要求记录具有相同的长度。在老的Fortran平台下,即便是在一些新的平台的,甚至需要知道记录的个数,甚至要在打开文件之前就要指定记录个数。
标准的Fortran并没有提供按照字节来读取或者写入文件的方式。
在C和C++中,文件被认为是无结构的0个或者更多个字节流,C语言中的fgetc()和fputc()函数可以按照字节来读取文件,其他额外需要的文件结构可以完全由用户程序来指定。
这种底层的、将文件看做数据流的方式使得在C和C++中写有一定结构的文件非常简单,因为用户可以完全精确的控制读写某个字节。实时运行库并不在其中进行任何的添加和删除,除非是在系统的文本文件中不适用ASCII LF 来表示换行。在这种系统中,C n (新建一行)可以使用其他自定义的字符来替换,例如(苹果MAC上可用CR,IBM PC上可用CR LF,微软Win系列上也是用CR LF的)。然而,即便在这些系统之上,这些文件也可以被以二进制方式打开,消除这些区别,让用户完全的控制这些数据流。
如此看来,我们仅能够希望在Fortran与C和C++之间通过文本文件来共享数据,即便如此,我们还是得小心。如果在Fortran中使用了科学计数法格式控制符(Dw.d),那么你得到的数据依然是不能被C和C++识别的。
Fortran 77允许只属于包含前导空格,有一些Fortran平台以0.12E 1格式输入而不是0.12E+01。Fortran 90 和95使用后者的输出格式。
默认的指数的域宽度是两位数组,但是在IEEE 754 浮点架构(不太清楚是什么东西)中,用于虚拟所有计算机的需要2000,而双精度指数则需要3位,四精度的需要四维。当需要三位指数的时候,"E"一般就被省略掉了, 写成0.12+306。
内嵌的空格和丢失的E指数,使得这些数据对于其他很多的程序语言来说就成为了无法识别的非法数字了。 幸运的是,这种情况有一个解决方案。使用 Ew.dEd 描述符,同时为双精度类型设置指数宽度为3,四精度型为4。你也可以使用1P这种描述符去掉前导的零,例如使用1PE12.5E3 描述符可以产生 1.2345E+123。 只是需要记住的是,1P描述符,同时也会影响Fw.d描述的的描述,所以在这种情况下,用0P来关闭着一修饰符。
在Fortrann77中引入指数宽度格式的修改识记上在1980年前后就已经广泛的被支持了。然而,老的Fortan代码有很多没有使用这一功能。所以,应该可以修改来程序中的输出格式以便于支持其他程序语言的读写。
其他的方面,我们必须要避免使用非十进制的数据类型或者长度前缀以及无符号类型,这样就有可能有助于数据文件的兼容。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-22 13:30
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社