24小时热门版块排行榜    

查看: 2694  |  回复: 6
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

kardrine

新虫 (初入文坛)

[求助] 怎样用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行出现断点,求大神解答,初来咋到,并没有钱...
回复此楼

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

7152075

铁杆木虫 (著名写手)

解决问题的方法比遇到的问题多


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
Chemistry
3楼2016-11-09 19:40:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 7 个回答

7152075

铁杆木虫 (著名写手)

解决问题的方法比遇到的问题多

【答案】应助回帖

★ ★ ★ ★ ★
感谢参与,应助指数 +1
kardrine: 金币+5, ★★★★★最佳答案, 很感谢你的帮助,刚看到,马上好好看看,我好像有94金币,但是现在最多只能给你5个了,实在抱歉,周围遇不到会FORTRAN的人,以后可能还会麻烦您,多谢多谢 2016-11-09 19:43:21
你这个代码是有问题的,很多东西你不是太了解,相关说明我在注释中给你了,你看一下,注意一些基本的问题。加油练,慢慢写你会越来越好的,祝成功。
CODE:
  
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

Chemistry
2楼2016-11-09 19:36:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

kardrine

新虫 (初入文坛)

送红花一朵
引用回帖:
4楼: Originally posted by 7152075 at 2016-11-09 20:29:00
小事,小事,还是希望你多写多练,同时希望你能加入一个名叫Fortran Coder的群,百度上直接打Fortran coder,那个网站是专门玩Fortran的,资料,教学视频很多,建议看看。同时希望你能加入那个群,群中大神如云,而 ...

前辈,你说的那网站一注册了,很有帮助。另外,还得让您帮忙看看,按照你给出的代码,我改了一下,
      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
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

kardrine

新虫 (初入文坛)

引用回帖:
2楼: Originally posted by 7152075 at 2016-11-09 19:36:26
你这个代码是有问题的,很多东西你不是太了解,相关说明我在注释中给你了,你看一下,注意一些基本的问题。加油练,慢慢写你会越来越好的,祝成功。
    program two_simension_random_seed !//主程序名中间不要有 ...

前辈,这一行,READ(1,'( 300D15.6 )' ) fai( :,i ) !//这个地方就实现了你的要求,冒号代表将从1~100,它是根据你声明部分的多少而定的,冒号代表的是1~300吧,我定义的     fai(i,j)是300*300的二维数组,另外有时间请看看我刚发的另一个求助帖吧,劳驾前辈。
6楼2016-11-10 21:45:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见