回 帖 发 新 帖 刷新版面

主题:求助:关于C语言和fortran语言的短整型数据类型的区别

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个回复)

沙发

c语言中的短整形就是一个byte吧,就8个bit,kind=2这种整形是两个byte,所以是c的两倍。你可以令kind=1试试,看是不是一样,在c里面你用size of看看short int占多大内存,每个机器可能都不一样的~

板凳

试了一下,C语言里面short int也是占了2个字节。
主要原因是:fortran里面虽然定义的是kind=2,是2个字节,但是输入到无格式文件中还是占用了4个字节,不知道为什么。

3 楼

我这里测试不会是 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 楼

谢谢臭石头雪球,按照您的程序得到的文件test.dat大小是40000字节,说明每个kind=2的整数还是占用了4个字节。是不是和我的编译器有关系,我用的是compaq fortran 6.5 。

5 楼

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 楼

回trimtrim,binary格式下生成的文件是20000字节了。谢谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册