Fortran学习总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Fortran学习总结
1、⽤结构体读取⼆进制⽂件存在的问题及解决⽅案
在讲这个问题之前,我们先看⼀段代码:
01 program fcode_cn
02 integer(4)::i=1,j=2,k=3
03 character::ch*2='cn'
04 type head
05 !sequence
06 character*2ch
07 integer(4)i,j,k
08 end type
09 type(head)he
10
11 open(11,file='11.txt',access='stream')
12 write(11)ch,i,j,k
13 close(11)
14 ! ⽅法1
15 open(11,file='11.txt',access='stream')
16 read(11)he.ch,he.i,he.j,he.k
17 close(11)
18 print*,he
19 ! ⽅法2
20 open(11,file='11.txt',access='stream')
21 read(11)he
22 close(11)
23 print*,he
24 pause
25 end
代码开头先向⽂件11.txt中写⼊⼀个字符串”cn”和3个4字节整数1, 2, 3 ,然后分别使⽤⽅法1和⽅法2读取并输出数据。
从代码本⾝分析,我们向⽂件中写⼊了14个字节的信息,⽅法1和⽅法2均⽤结构体去读取这个14字节信息。
理论上说,这不存在问题,但是在执⾏时,我们遇到下⾯的错误(图1):
读取同样的数据为什么⽅法1能够正确执⾏,⽽⽅法2却遇到⽂件尾呢?这跟结构体元素的对齐⽅式有关。
打开项⽬属性-Fortran-data,点开structure member alignment选项(如图2),查看对齐⽅式,有1字节、2字节、4字节、8字节和16字节,win32系统缺省为4字节。
现在我们来解释上⾯出现的错误。
由于win32系统缺省对齐⽅式为4字节,在使⽤⽅法2进⾏⽂件读取的时候,每次从⽂件中读取4字节数据,依次赋值给变量ch, i, j, k。
因此需要读取4×4=16字节信息,但⽂件中仅有14字节信息,故出现如上错误。
为避免以上错误:
⼀是采⽤⽅法1进⾏读取,但如果结构体太复杂,⽐如为SEGY数据道头时,这种⽅法不可取;
⼆是将structure member alignment选项设置为1字节,这依赖于编译器设置,可移植性较差。
我们推荐另⼀种解决⽅案,即在结构体定义部分加上sequence指令:
type head
sequence
character*2 ch
integer(4) i,j,k
end type
如此,我们就可放⼼使⽤⽅法2进⾏数据读取(图3)。
有关sequence的详细介绍可参考帮助⽂档。