Read 的规则:
按行读取,每次读一行,读完后光标自动跳到下一行的开头,空格和逗号代表结束(所以空格和逗号也是读取的一部分的话,需要使用“输入输出格式”)
如果想要将一行数据读入数组,代码为:
Read(10,*) s(:,:,:)
不用规定输入输出格式,因为会根据s(:,:,:)确定需要读入的数字的个数,然后fortran会按部就班的读取,甚至文件中当前这一行的数字个数不足以填满s(:,:,:)的时候,read会自动跳到下一行继续搜索数字,直到填满s(:,:,:)为止。
但是需要注意给数组赋值的顺序:read会把它搜索到的第一个数字给s(1,1,1),第二个给s(2,1,1),第三个给s(3,1,1)…
程序9 1: 将 read(unit=field,fmt="(A79)",iostat=status)buffer 中的A79改为A2,结果只输出每行的前两个字符,说明read是按整行整行读取的。
中间空了几行之后,空行之后的内容还是能被读取和输出,这说明,空行和空白是不一样的:空行也算是一种文本内容,因此不会终止读取,而空白意味着结束。
!读取文件
program main
implicit none
character(len=79)::filename="",buffer
integer,parameter::field=10
integer::status=0
logical alive
inquire(file=filename,exist=alive)
if(alive)then
open(unit=field,file=filename)
do while(.true.)
read(unit=field,fmt="(A79)",iostat=status)buffer
if(status/=0)exit
write(*,"(A79)")buffer
end do
el
write(*,*)filename,"does't exist."
end if
pau
stop
end program main
=============================================
附
===============================
1234555666
879789789789789
二)Fixed Format(固定格式)
扩展名:.F 或 .FOR
1标号区:第l-5列
可以写l至5位整数。也可以没有标号。标号区中的空格不起作用。如lOO与100 或1 0 0
作用相同。标号应是无符号整数(无正负号或小数点)。标号大小顺序没有任何要求。假如第二行的标号为1000,第三行的标号可以是10,也可以是99999。
标号区内不得出现标号以外的内容,但注释行例外。注释行的内容可以写在标号区内,一行中第一列为C或*的,该行即被认为注释行,编译时对该行内容不作翻译,对程序运行不产生任何影响。如果在第一列上出现的不是数字、空格或C和*的字符,编译时按出错处理。
2续行区:第6列
如果在一行的第6列上写一个非空格和非零的字符,则该行作为其上一行的续行。注意在某些系统中,这个字符可以不限于上面所列的,如 @ } ] ~ 等字符均可使用。F77允许一个语句有19个续行(即一个语句最多可以写成20行)。有的程序中第6列上用“l”,“2”,…表示该行是第1个或第2个续行,但用数字字符容易与第7列的数字形成连续的数字串而引起错觉,故最好使用固定的特殊字符。
3语句区:第7-72列
不要求一定从第7列开始写语句,可以从第7列以后(72列以前)的任何一列开始写,但一行只能写一个语句。如果写满了72列,一旦在终端上修改程序时在该行又插入了一些字符,就会使本行最后几个字符超出语句区而引起意料不到的错误。特别注意到语句最后的空格将可能溢出72列,在某些计算机系统上将导致难以查出的错误。应注意,引号内的字符串中所包括的空格是有效的,不能忽略。
4注释区:第73-80列
在卡片输入法时代,程序员一般利用此8列为程序行编序号以便查找。注释区只对程序员提供辨别信息,不是语句的一部分,在编译时不对72-80列作处理。
程序 9 2 将成绩输入
module typedef
type student
integer Chine,English,Math
end type
end module
program main
u typedef
implicit none
integer::students
type(student),allocatable::s(:)
integer,parameter::fileid=10
character(len=80)::filename=""
integer::i
write(*,*)"how many students?"
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 the',I2,'th student''s scores')")i
read(*,*)s(i)%Chine,s(i)%English,s(i)%Math !Sb了,其实可以直接写成s(i)
write(fileid,"('Student Number:',I2,/,'Chine Score:',I3,'English Score:',I3,'Math Score:',I3)")i,s(i)!s(i)的三项可以分别设置各自格式,另外注意括号里封装字符用单引号
end do
clo(fileid)
pau
stop
end program main
程序9 3 读取并且输出
module typedef
type student
integer Chine,English,Math
end type
end module
program main
u typedef
implicit none
integer,parameter::fileid=10
integer::students
integer::n
type(student)::s
character(len=10)::filename=""
logical::alive
integer::stat=0
inquire(file=filename,exist=alive)
if(.not.alive)then
write(*,*)"file doesn'nt exist"
stop
end if
open(unit=fileid,file=filename)
do while(stat==0)
read(fileid,"(16XI2,/,14XI3,14XI3,11XI3)",iostat=stat)n,s !不知道为什么不能写作unit=fileid
write(*,"('序号:',I2,'语文:',I3,'英语:',I3,'数学:',I3,I3)")n,s,stat
end do
pau
stop
end program main
程序9 5,跳跃读取:还是不太懂REC的用法
program main
implicit none
character(len=80)::filename=""
integer::fileid
logical::alive
integer::stat
integer::player
real::score
inquire(file=filename,exist=alive)
if(.not.alive)then
write(*,*)"file doesn't exist"
stop !体会stop的用法,用于在程序中间终止程序。
end if
open(unit=fileid,file=filename,access="direct",&
form="formatted",recl=7,status="old")
do while(.true.)
write(*,*)"查询第几棒?"
read(*,*)player
read(fileid,"(F5.2)",rec=player,iostat=stat)score
if(stat/=0)exit
write(*,"(F5.2)")score
end do
pau
stop
end program main
程序 9 6 内部变量的应用:本程序中invalid很好!否则我只能通过监视内层那个do的循环的次数来判断strng中的所有字母是不是检验完毕,本程序中的invalid这个变量显然更简单巧妙,先设置.true.进入外循环,然后.fal.假设输入的都是正确的,可以跳出,然后用if“考验”这个假设。。。。。。。很巧! 另外,本计算机能接受的最大整数是4byte、32bits,即2147483647。默认的也是长整型,即kind=4。
program main
implicit none
integer::i
integer,external::GetInteger
i=GetInteger()
write(*,*)i
pau
stop
end program main
integer function GetInteger()
implicit none
character(len=80)::string
integer::i,code
logical::invalid=.true.
do while(invalid)