Fortran学习13:IO 2

对顺序文件的操作:顺序文件在读写的时候,不能任意的赋值道文件的某个卫视读写数据,只能从头开始一步步进行,改变我觉得写位置的时候,只能一步步的进退,或者直接移动回到文件开头。

简单的跟着书上的练一个:

program main 
implicit none
CHARACTER(len=79)::filename
CHARACTER(len=79)::buffer
integer,PARAMETER::fileid=10
INTEGER::status=0
logical alive
write(*,*)"File name:"
read(*,"(A79)")filename
inquire(file=filename,exist=alive)
if(alive)then
open(unit=fileid,file=filename,ACCESS="sequential",status="old")
do while(.true.)
read(unit=fileid,fmt="(A79)",iostat=status)buffer
if(status/=0)exit
write(*,"(A79)")buffer
//!每读入一行,就把这一行的信息打印在屏幕上。
end do 
else 
write(*,*)TRIM(filename),"dosen't exit"
end if 
stop "over"
end 

好家伙,这个读文件牛了:

直接把我写的python的代码给读出来了,厉害厉害!!!

这下来跟着写两个文件,一个是写入,一个是读出:

module typedf
    type student
        integer chinese,math,physical
    end type
end module
program main 
    use typedf
    implicit none
    integer::students
    type(student),ALLOCATABLE::s(:)
    CHARACTER(len=80)::filename="data.txt"
    integer,PARAMETER::fileid=10
    integer::i
    write(*,*)"how many studentss in your class?"
    read(*,*)students
    allocate(s(students),stat=i)
    if(i/=0)then 
        write(*,*)"Allocate buffer fail"
    stop 
    end if
    open(fileid,file=filename)
    do i=1,students
        write(*,"('input chinese&math&physical grade of student'I2)")i
        read(*,*)s(i)%chinese,s(i)%math,s(i)%physical
        write(fileid,"('sit:'I2/'chinese:'I3'math:'I3 'physical:'I3)")i,s(i)
    end do 
    close(fileid)
stop "over"
end 

 然后来读文件:

module typedf
    type student
        integer chinese,math,physical
    end type
end module
program main
    use typedf
    implicit none
    type(student)::s
    CHARACTER(len=80)::filename="data.txt"
    integer,PARAMETER::fileid=10
    logical alive
    integer error,no 
    INQUIRE(file=filename,exist=alive)
    if(.not.alive)then 
        write(*,*)TRIM(filename),"dosen't exist"
        stop 
    end if
    open(fileid,file=filename)
    do while(.true.)
        read(fileid,"(5XI2,/,5XI3,6XI3,6XI3)",iostat=error) no,s
        if(error/=0)exit
        write(*,"(I2 'student Chinese:'I3 'English:'I3 'math:'I3)")no,s
    end do 
    close(fileid)
stop "over"
end      

有点奇怪,这个读文件的程序老是直接运行到stop了,不显示读文件结果。

接下来是直接访问文件的操作:

直接访问就是把文件的空间、内容实现区分好几个同样大小的模块,他们会自动编号(按顺序),读写文件的时候,先复制文件读写位置在第几个模块,之后再来进行读、写工作。

跟着书上来一个查找棒球手的打击率:

program main
    implicit none
    integer ,PARAMETER::fileid=10
    CHARACTER(len=20)::filename="data.txt"
    integer player
    real hit
    integer error
    logical alive
    inquire(file=filename,exist=alive)
    if(.not.alive)then
        write(*,*)TRIM(filename),"doesn't exit"
    stop
    end if 
    open(unit=fileid,file=filename,ACCESS="direct",form="formatted",recl=6,status="old")
    do while(.true.)
        write(*,"('查第几棒?')")
        read(*,*)player
        read(fileid,fmt="(F4.2)",rec=player,iostat=error)hit
        if(error/=0)exit 
        write(*,"('打击率:'F4.2)")hit
    end do 
    close(fileid)

    stop "over"
    end 

有个问题,出来的老是乱码,emm,无语了,但的确是可以用。

对二进制文件的读取,在open中的热处理所设置的整数n,会随着编译器不同而不同,又是是nbytes,有时又是4nbytes。

来,再写一个写二进制文件的程序,再用上面的读棒球手打击率来读一下:

program main 
implicit none
integer,PARAMETER::fileid=10
CHARACTER(len=20)::filename="list.bin"
integer player
real:: hit(9)=(/3.12,2.98,3.34,3.45,2.86,2.54,2.78,2.23,2.56/)
open(unit=fileid, file=filename, form="unformatted",access="direct",recl=4 ,status="replace")

do player=1,9
write(fileid,rec=player)hit(player)
end do 


close(fileid)
stop
end program

不贴运行结果了,有兴趣的话可以自己复制运行一下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值