| 查看: 2692 | 回复: 6 | ||
[求助]
怎样用read读取文件赋值二维数组 已有1人参与
|
|
用以下程序得到随机数,想保存起来,以便以后每次计算都能得到相同的结果,可是再次读取数据的时候 总是出现断点,求指教,下面把俩程序都贴出来。 program two simension random seed implicit none real::a(300,300),b(300,300) real::rnd integer i,j,n real::x n=300 do i=1,n do j=1,n a(i,j)=0.0 b(i,j)=0.0 end do end do CALL RANDOM_SEED() open(1,file='E:\试验程序\one dimension random seed\data1.dat') open(2,file='E:\试验程序\one dimension random seed\data2.dat') do i=1,n do j=1,n call random_number(rnd) x=int(rnd*10) x=x/10 a(i,j)=x end do end do do i=1,n do j=1,n call random_number(rnd) x=int(rnd*10) x=x/10 b(i,j)=x end do end do write(1,20)((a(i,j),j=1,n),i=1,n) write(2,20)((b(i,j),j=1,n),i=1,n) 20 FORMAT (1X,300D15.6) end program mass of disorder !1.寻找正确读取格式 dimension fai(300,300) OPEN(100,FILE='E:\试验程序\one dimension random seed\data1.dat', 1STATUS='OLD') open(101,file='E:\试验程序\one dimension random seed\fai.dat') DO i=1,300 do j=1,300 10 READ(100,'(D15.6)')fai(i,j) end do END DO write(101,20)((fai(i,j),j=1,300),i=1,300) 20 FORMAT (1X,300D15.6) end 总是在第二个程序标着10的read行出现断点,求大神解答,初来咋到,并没有钱... |
» 猜你喜欢
计算机、0854电子信息(085401-058412)调剂
已经有4人回复
基金申报
已经有3人回复
国自然申请面上模板最新2026版出了吗?
已经有9人回复
溴的反应液脱色
已经有6人回复
纳米粒子粒径的测量
已经有7人回复
常年博士招收(双一流,工科)
已经有4人回复
推荐一本书
已经有10人回复
参与限项
已经有5人回复
有没有人能给点建议
已经有5人回复
假如你的研究生提出不合理要求
已经有12人回复
7152075
铁杆木虫 (著名写手)
解决问题的方法比遇到的问题多
- 应助: 44 (小学生)
- 金币: 17670.7
- 红花: 10
- 帖子: 2108
- 在线: 175.6小时
- 虫号: 3086834
- 注册: 2014-03-25
- 性别: GG
- 专业: 理论和计算化学

2楼2016-11-09 19:36:26
7152075
铁杆木虫 (著名写手)
解决问题的方法比遇到的问题多
- 应助: 44 (小学生)
- 金币: 17670.7
- 红花: 10
- 帖子: 2108
- 在线: 175.6小时
- 虫号: 3086834
- 注册: 2014-03-25
- 性别: GG
- 专业: 理论和计算化学
★
jjdg: 金币+1, 辛苦了 2016-11-11 11:45:05
jjdg: 金币+1, 辛苦了 2016-11-11 11:45:05
|
怪了,这插入代码功能也不知道出什么问题了,重新贴。 program two_simension_random_seed !//主程序名中间不要有空格 implicit none real::a( 300,300 ), b( 300,300 ) real::rnd real::fai( 300,300 ) integer i,j,n real::x n=300 do i=1,n do j=1,n a( i,j ) =0.0 b( i,j ) =0.0 end do end do CALL RANDOM_SEED() open( 1,file='E:\试验程序\one dimension random seed\data1.dat' ) open( 2,file='E:\试验程序\one dimension random seed\data2.dat' )!//意义不明,不知道你要干什么 open( 101,file='E:\试验程序\one dimension random seed\fai.dat' ) do i=1,n do j=1,n call random_number( rnd ) x=int( rnd*10 ) x=x/10 a( i,j )=x end do end do do i=1,n do j=1,n call random_number( rnd ) x=int( rnd*10 ) x=x/10 b( i,j )=x end do end do write( 1,20 )( ( a( i,j ),j=1,n ),i=1,n ) write( 2,20 )( ( b( i,j ),j=1,n),i=1,n ) 20 FORMAT ( 1X,300D15.6 ) rewind( 1 ) !//将文件转回开头,从头读就行了,不必再重新open一次 rewind( 2 ) !//另外,通道号为10以内的最好不要用,因为它们是程序预留的通道号 DO i=1,300 READ(1,'( 300D15.6 )' ) fai( :,i ) !//这个地方就实现了你的要求,冒号代表将从1~100,它是根据你声明部分的多少而定的 write( 101,20 ) fai( :,i ) END DO close( 1 ) !//一定要有程序结束后将文件关闭的习惯,否则以后编大程序的时候,会出各种各样的问题 close( 2 ) close( 101 ) end program two_simension_random_seed |

3楼2016-11-09 19:40:41
7152075
铁杆木虫 (著名写手)
解决问题的方法比遇到的问题多
- 应助: 44 (小学生)
- 金币: 17670.7
- 红花: 10
- 帖子: 2108
- 在线: 175.6小时
- 虫号: 3086834
- 注册: 2014-03-25
- 性别: GG
- 专业: 理论和计算化学

4楼2016-11-09 20:29:00
送红花一朵 |
前辈,你说的那网站一注册了,很有帮助。另外,还得让您帮忙看看,按照你给出的代码,我改了一下, program mass_of_disorder integer::i,j,k dimension::fai(300,300) open(1,file='E:\试验程序\one dimension random seed\data1.dat') open(101,file='E:\试验程序\one dimension random seed\fai.dat') DO i=1,300 READ(1,'(300D15.6)') fai(:,i) end do do i=1,300 do j=1,300 fai(i,j)=mod(fai(i,j),1.0) end do end do write(101,20) ((fai(i,j),j=1,300),i=1,300) 20 FORMAT (1X,300D15.6) !end do close(1) close(101) end program mass_of_disorder 之所以用mod,是因为1里面的都是[0,1)之间的小数,但是read()fai(:,i)以后,有很多值都超过1,甚至10了,这一点弄不明白。不过反正是我需要的是随机值,也没太影响。以上这个程序可以,我把这个过程用到其他程序里面,比如以下 DO i=1,300 READ(1,'(300D15.6)') fai(:,i) READ(1,'(300D15.6)') fai0(:,i) READ(1,'(300D15.6)') cata(:,i) end do do i=1,300 do j=1,300 fai(i,j)=mod(fai(i,j),1.0) fai0(i,j)=mod(fai(i,j),1.0) cata(i,j)=mod(fai(i,j),1.0) end do end do 就总是在read行出现断点,跟最开始一样了,怎么破? |
5楼2016-11-10 17:28:51
6楼2016-11-10 21:45:50
7152075
铁杆木虫 (著名写手)
解决问题的方法比遇到的问题多
- 应助: 44 (小学生)
- 金币: 17670.7
- 红花: 10
- 帖子: 2108
- 在线: 175.6小时
- 虫号: 3086834
- 注册: 2014-03-25
- 性别: GG
- 专业: 理论和计算化学
★
jjdg: 金币+1, 谢谢 2016-11-11 11:45:31
jjdg: 金币+1, 谢谢 2016-11-11 11:45:31
|
不是你说的那样的,里面的随机数都是0~1之间的,你可能把其中的0.60000000D+00当成大于1的数,这是错误的,这个代表的是0.60000000x10^0(0.6乘以10的0次方),其实是0.600000,小于1的数。 DO i=1,300 READ(1,'(300D15.6)') fai(:,i) READ(1,'(300D15.6)') fai0(:,i) READ(1,'(300D15.6)') cata(:,i) end do do i=1,300 do j=1,300 fai(i,j)=mod(fai(i,j),1.0) fai0(i,j)=mod(fai(i,j),1.0) cata(i,j)=mod(fai(i,j),1.0) end do end do 这一部分,首先第一个部分,你这么写的意思是将文件中前三行分别读完,然后赋值给了fai,fai0和cata,如果程序要是正确的话,总行数需要900行才行,但是你的文件总行数才300行,所以错了。文件读完了一行后,会直接转到下一行,并不会像你想象的那样还从头读。后面的部分不太理解你要干啥,不还是其本身嘛。前面那部分这样改: rewind(1) !//别忘了让文件转到开头部分 DO i=1,300 READ(1,'(300D15.6)') fai(:,i) end do rewind(1) DO i=1,300 READ(1,'(300D15.6)') fai0(:,i) end do rewind(1) DO i=1,300 READ(1,'(300D15.6)') cata(:,i) end do PS:请养成一个良好的习惯,程序声明部分用implicit none。 |

7楼2016-11-11 08:38:24












回复此楼