找回密码
 注册
Simdroid-非首页
查看: 105|回复: 12

[3. Fortran] 子程序中文件操作

[复制链接]
发表于 2013-12-29 18:47:23 | 显示全部楼层 |阅读模式 来自 辽宁沈阳
在子程序中open一个文件,写入数据,比如就写入一个整数10,status设为‘old’。open(unit=2,file='data.txt',status='old')
write(2,*) 10
close(unit)


在主程序中调用3次。
问:文件中有几个10?

发表于 2013-12-30 15:25:41 | 显示全部楼层 来自 北京
Simdroid开发平台
应该有1个10吧
回复 不支持

使用道具 举报

发表于 2013-12-31 13:59:23 | 显示全部楼层 来自 浙江杭州
3个啊,你试一下呗,这个感觉在考我们一样
回复 不支持

使用道具 举报

 楼主| 发表于 2013-12-31 20:06:16 | 显示全部楼层 来自 辽宁沈阳
alsoran 发表于 2013-12-31 13:59
3个啊,你试一下呗,这个感觉在考我们一样

试的结果是3个,但我觉得是1个,求解释
回复 不支持

使用道具 举报

发表于 2013-12-31 21:12:58 | 显示全部楼层 来自 上海
koorb 发表于 2013-12-31 20:06
试的结果是3个,但我觉得是1个,求解释

status=‘old’默认是追加形式吧
回复 不支持

使用道具 举报

 楼主| 发表于 2013-12-31 22:20:13 | 显示全部楼层 来自 辽宁沈阳
alsoran 发表于 2013-12-31 21:12
status=‘old’默认是追加形式吧

如果是追加的话,那执行2次主程序,就应该是6个10,可实际不是。
回复 不支持

使用道具 举报

发表于 2014-1-1 11:44:17 | 显示全部楼层 来自 浙江杭州
不要写unit=2,写unit>10的数字试试,unit=2 默认是屏幕输出,unit号写10以上比较好
回复 不支持

使用道具 举报

发表于 2014-1-2 12:00:42 | 显示全部楼层 来自 重庆
把 close(unit)
改为 close(2)

除非你很确定 unit 这个变量的值就是 2
回复 不支持

使用道具 举报

 楼主| 发表于 2014-1-4 08:41:20 | 显示全部楼层 来自 辽宁沈阳
alsoran 发表于 2014-1-1 11:44
不要写unit=2,写unit>10的数字试试,unit=2 默认是屏幕输出,unit号写10以上比较好 ...

将unit设成>10的数,果然可以。
但我仍然不明白,既然unit=2是屏幕输出,为啥write执行的结果却是将数据写入文件呢?
回复 不支持

使用道具 举报

 楼主| 发表于 2014-1-4 08:44:02 | 显示全部楼层 来自 辽宁沈阳
bvoodnuq 发表于 2014-1-2 12:00
把 close(unit)
改为 close(2)

用close(2)之后,文件中就一个10.
请教一下,我在程序中没有改变unit的值,为啥没有colse数据文件呢?
回复 不支持

使用道具 举报

发表于 2014-1-5 16:17:01 | 显示全部楼层 来自 重庆
本帖最后由 bvoodnuq 于 2014-1-5 16:18 编辑
koorb 发表于 2014-1-4 08:44
用close(2)之后,文件中就一个10.
请教一下,我在程序中没有改变unit的值,为啥没有colse数据文件呢? ...

你的代码里,没有任何一个变量叫 unit
Open( unit = 2 并不意味着声明了一个变量叫unit并赋值为 2
open 语句中的 unit 是语法规定的子句,与变量没有关系。
就好像
  Character( Len = 512 ) :: File
  File = 'b.txt'
  Open( unit = 2 , File = 'a.txt' )
  此时,File 依然是 'b.txt'

所以,既然没有 unit,那么直接 close( unit ),此时的 unit 值是不确定的,可能是0,也可能是其他值。所以,一般来说,此时的 unit 这个通道号不存在,所以也就没关掉。
一般我写代码就不写 unit,直接 Open( 12 , File = '文件名' )
回复 不支持

使用道具 举报

发表于 2014-1-5 16:20:26 | 显示全部楼层 来自 重庆
koorb 发表于 2014-1-4 08:41
将unit设成>10的数,果然可以。
但我仍然不明白,既然unit=2是屏幕输出,为啥write执行的结果却是将数据 ...

unit = 2 并不一定是屏幕输出。这个语法没有规定,但是语法建议程序员使用 10 以上的通道号。10 以下的通道号留给编译器使用。

某些编译器可能会使用 2,3,5,6 这样的通道号用于屏幕输出,输出。但不确定,不同的编译器规定不同。
Intel Fortran 使用的是 5,6,并且允许用户重新定义。而 Silverfrost 的编译器,则使用 -1 和 0
回复 不支持

使用道具 举报

 楼主| 发表于 2014-1-6 07:25:41 | 显示全部楼层 来自 辽宁沈阳
感谢bvoodnuq!

我是用c语言的习惯看待Fortran。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-27 18:26 , Processed in 0.036177 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表