对顺序文件的操作:顺序文件在读写的时候,不能任意的赋值道文件的某个卫视读写数据,只能从头开始一步步进行,改变我觉得写位置的时候,只能一步步的进退,或者直接移动回到文件开头。
简单的跟着书上的练一个:
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
不贴运行结果了,有兴趣的话可以自己复制运行一下。