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

[3. Fortran] 【讨论】关于fortran中数据以文件的形式读入格式的问题

[复制链接]
发表于 2004-6-6 10:44:03 | 显示全部楼层 |阅读模式 来自 大连理工大学
如果我想保存在记事本里面的m行n列的数组用fortran语言读入,
  
假定M,N为参数
  
   M=20
   N=40
   READ(3,200)((MATRIX(I,J),J=1,N),I=1,M)
   WRITE(4,200)((MATRIX(I,J),J=1,N),I=1,M)
   200    FORMAT(40F10.3)
  
也就是说,严格意义上的格式符合可以读入。
  
读入的文件见附件,其中的数据是用(40F10.3)格式输出来的。
  
那有没有更自由一点的格式,READ(3,*)可以吗?如果不行,为什么???
  
我在用这个格式时,经常会出错,很是头疼,请高手赐教!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2004-6-7 08:38:41 | 显示全部楼层 来自 香港

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

Simdroid开发平台
如果要一次性读入像你这种类型的文件,只能采用格式输入。
因为数据文件本身是排列好的了。
按照数据的排列格式读入可以保证读入数据的准确性。
我觉得这样读入数据没有什么麻烦的地方,不知道为何让你头疼?
 楼主| 发表于 2004-6-7 12:14:09 | 显示全部楼层 来自 大连理工大学

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

是因为我的数组都是动态的,但我还想按该数组的列数输出。
所以在写输出数组的格式时(*F10.3)前面的*无法确定。
  
不知自己表达的意思清楚不???
发表于 2004-6-7 13:15:19 | 显示全部楼层 来自 北京

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

下面是我的一个程序中的一段,认真看看,思考一下,稍作修改是能解决你的问题的。 其中 “……”表示该处省略了一些东西,当然是与你问题无关的,numStory是未知参数,有使用者指定,由它确定动态数组B(:,:)的大小。我是 这一程序段解决的是一个输出的问题,反过来解决输入应该也没有问题。            
                REAL,ALLOCATABLE :: B(:,:)
  INTEGER :: numStory,H,P,Z,GW,SW
                ……………………
                READ(*,"(I2)") numStory
              ………………………………………
  allocate(B(2501,numStory))
               …………………………………………
  OPEN(2,FILE="LIST.DAT")
  WRITE(2,"(99I15)") (Z,Z=1,numStory)
  DO H=1,2501
    WRITE(2,"(99E15.6)") (B(H,Z),Z=1,numStory)
  enddo
  close(2)
  
  DEALLOCATE(B)
                ………………………………………
                end
  
angel1999 祝你成功,希望我的代码共享是提高了而不是弱化了你的编程能力:)

评分

1

查看全部评分

 楼主| 发表于 2004-6-7 16:43:44 | 显示全部楼层 来自 大连理工大学

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

谢谢 BG 的指点。
我会用了。
高手一指点,胜读三年书。
希望能经常得到你的帮助。
发表于 2004-6-8 22:10:35 | 显示全部楼层 来自 陕西西安

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

实际上对于格式而言,用“*”是可以读取你所定义的类型的,如果不信可编一小程序试验一下,我试了一下,是可以的
  
这是最简单的方法
  1. READ(3,*) ((MATRIX(I,J),J=1,N),I=1,M)
复制代码

评分

1

查看全部评分

发表于 2004-6-9 14:36:11 | 显示全部楼层 来自 北京

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

jinguangyang 我贴的那段代码是为了格式化输出用的,看到楼主的问题没多想就贴出来了,你的代码应该才是楼主提出问题的最恰当的方法,哈哈,解决问题还是得简单为好,这才真正显示了编程者的价值,向你学习!
 楼主| 发表于 2004-6-9 16:30:45 | 显示全部楼层 来自 大连理工大学

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

谢谢 jinguangyang、谢谢BG ,不管是那种方法,都使我对格式问题有了更深刻的了解。
   
现在越来越喜欢这个论坛了。
  
发表于 2004-6-12 22:20:57 | 显示全部楼层 来自 陕西西安

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

谢谢大家的夸奖,实际上是我读不懂BG的程序,才想试一下简单一些的,而angle|1999一下子就能理解其精髓才是难能可贵的,向大家学习才对!
hujianhuahjhhjh 该用户已被删除
发表于 2004-6-22 09:53:20 | 显示全部楼层 来自 山西太原
提示: 作者被禁止或删除 内容自动屏蔽
hujianhuahjhhjh 该用户已被删除
发表于 2004-6-22 10:04:01 | 显示全部楼层 来自 山西太原
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2004-7-5 08:41:47 | 显示全部楼层 来自 北京

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

"为什么用99,如果numStory大于99怎么办?我想可能会自动转到下一个99I15,是吗?这样的话99就可以用随便一个数字代替了,我不知道对不对? "
  
hujianhuahjhhjh 你的问题我刚看到,我的这段源程序是根据我当时的需要编的,我的动态数组大小中的numStory一项不会大于99,所以就选用了99,我觉得要达到格式化输出这一目的,这个数必须大于numStory至于多少应该没问题,你说的情况应该会出现,你可以试试,希望得到你的反馈。
  
不过99I15这一格式一行会战99×15=1485个字符位,我用到的最长的一行是20×15=300个字符,我相信每行超过1485个字符,应该没有这个必要把,即使99I1也得每行99个字符,看起来很麻烦的,不太人性化,你说呢:)
  
你所说的数据1.500000000000000+2,我觉得应该是实型数据,你不妨自己编段程序读读看,调整一下格式化输入实型数的长度、小数和指数部分长度等参数试试,祝你成功,希望把结果和大家说说:)
发表于 2004-7-5 12:42:12 | 显示全部楼层 来自 江苏南京

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

关于 hujianhuahjhhjh 的数据格式输入问题:
  
我试了一下,采用自由格式读入就可以,你不妨一试:
  
  program main
  real*8 a,b,c,d
  open(2,file="1.txt")
  read(2,*)a,b,c,d
  write(*,*)a,b,c,d
  close(2)
  end
  
文件1.txt内容:
1.500000000000000+2 3.535533905932738+0 -3.535533905932731+0 2.345657656523656-6
  
读入正确。
  
如果采用格式读入,所给的数据位数应该一样才行,1.txt中的第三个数据为负值,多一位,不知道实际文件的数据是否相同。
  
  program main
  real*8 a,b,c,d
  open(2,file="1.txt")
  read(2,111)a,b,c,d
  write(*,*)a,b,c,d
  close(2)
111  format(E19.15,1X,E19.15,1X,E20.15,1X,E19.15)
  end
  
读入同样正确。
hujianhuahjhhjh 该用户已被删除
发表于 2004-7-9 21:25:49 | 显示全部楼层 来自 山西太原
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2004-7-11 15:06:47 | 显示全部楼层 来自 江苏南京

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

奇怪!我用的Fortran PowerStation4.0 采用hujianhuahjhhjh的程序段时,要把输入的格式改一下:"(i4,3g20.0)" 才能正确读入,而且精度也不差。不知道是否编译器的原因??
  
integer a  
real*8 b,c,d  
open(1,file="free.txt",form="formatted",status="old")  
read (1,"(i4,3g20.0)") a,b,c,d  
write(*,*) a,b,c,d  
end  
  
输出的结果为:
       1354  -1.255500000000053E-001  -4.249999999999999E-001
  0.000000000000000E+000
发表于 2004-7-11 23:09:39 | 显示全部楼层 来自 美国

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

对于这种数据格式,完全没有必要用格式读入,原因很简单:如果输入数据文件有一点变化怎么办?自由格式读入是最简单有效的方式!
发表于 2004-7-13 17:13:46 | 显示全部楼层 来自 江苏南京

回复: 【讨论】关于fortran中数据以文件的形式读入格式的问题

自由格式读入恐怕不行,因为hujianhuahjhhjh给的数据之间没有分隔符,空格也没有.
hujianhuahjhhjh 该用户已被删除
发表于 2004-7-24 11:21:59 | 显示全部楼层 来自 山西太原
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

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

GMT+8, 2024-11-2 05:29 , Processed in 0.077153 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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