主题:求助:关于C语言和fortran语言的短整型数据类型的区别
ogions
[专家分:40] 发布于 2010-03-22 09:38:00
C语言中的int short类型和fortran中integer(kind=2)类型可是一样的?
比如:在fortran中定义
integer(kind=2) :: aa(100,100)
再把这个数据写入文件中:
open(10,file='test.dat',form='unformatted')
write(10) aa
close(10)
得到的文件test.dat的大小与在C语言中用int short定义同样大小的数组再写入binary文件中得到的文件(test1.dat)大小不一样。test.dat大小是test1.dat大小的2倍,请问这是什么原因造成的?
回复列表 (共6个回复)
沙发
thanatus [专家分:60] 发布于 2010-03-22 09:57:00
c语言中的短整形就是一个byte吧,就8个bit,kind=2这种整形是两个byte,所以是c的两倍。你可以令kind=1试试,看是不是一样,在c里面你用size of看看short int占多大内存,每个机器可能都不一样的~
板凳
ogions [专家分:40] 发布于 2010-03-24 22:42:00
试了一下,C语言里面short int也是占了2个字节。
主要原因是:fortran里面虽然定义的是kind=2,是2个字节,但是输入到无格式文件中还是占用了4个字节,不知道为什么。
3 楼
臭石头雪球 [专家分:23030] 发布于 2010-03-25 06:20:00
我这里测试不会是 2 倍,而是多了 8 字节。因为无格式顺序读写,Fortran 会在前后各增加 4 个字节,记录该次读写的总字节数。因此每个记录前后多出 4 字节。
如果你一次写入,那么应该是多出 8 字节,而不是变成 2 倍。
你再测试一下。有问题可以查看我签名里的那个帖子:
关于二进制文件的读写【写给新手】
[url]http://bbs.pfan.cn/post-256197.html[/url]
二进制文件,一般用 direct 方式读写。
试试看这样:
integer(kind=2) :: aa(100,100)
aa=3
open(10,file='test.dat',form='unformatted',access='direct',RECL=100/2)
!上面的 RECL=100/2 如果有错误,就改成 RECL=100*4/2
Do i = 1 , 100
write(10,REC=i) aa(:,i)
End Do
close(10)
end
4 楼
ogions [专家分:40] 发布于 2010-04-03 17:08:00
谢谢臭石头雪球,按照您的程序得到的文件test.dat大小是40000字节,说明每个kind=2的整数还是占用了4个字节。是不是和我的编译器有关系,我用的是compaq fortran 6.5 。
5 楼
trimtrim [专家分:1640] 发布于 2010-04-03 18:08:00
try:
open(10,file='test.dat',form='BINARY')
! 上面的 RECL=100/2 如果有错误,就改成 RECL=100*4/2
Do i = 1 , 100
write(10) aa(:,i)
End Do
close(10)
6 楼
ogions [专家分:40] 发布于 2010-04-04 11:24:00
回trimtrim,binary格式下生成的文件是20000字节了。谢谢!
我来回复