其实,文件的读取时非常简单的,就是两个很重要的命令,open、close,然后read、write这些都是常规操作,没啥大的困难。
现在今天第一个问题时字符串变量文件:讲就是使用写入文件的方法,把数据写到一个字符串变量里面去,先跟着书上来试试:
program main
implicit none
integer::a=2
integer::b=3
CHARACTER(len=20)::string
write(unit=string,fmt="(I2,'+',I2,'=',I2)")a,b,a+b
write(*,*)string
stop
end
//!write命令除了可以复制一个整数值作为输出位置外,还可以赋值一个字符串变量来作为输入的窗口
输出结果也非常简单:

除了write,也可以把数据经过read命令从字符串里面读出来
program reading
implicit none
integer::a
character(len=20)::string="123"
read(string,*)a
write(*,*)a
stop
end
输出就是123
使用read来从键盘输入数据的时候,如果输入的是错误的数据,就有可能导致程序死机,好一点的处理方法就是,先暂时把数据当成字符串来读入,再检查字符串里是否有不合理的地方。
康康书上的一个数字读入程序:
program main
implicit none
integer i
integer,external::GetInteger
i=GetInteger()
write(*,*)i
stop "over"
end program
integer function GetInteger()
implicit none
character(len=80)::string
logical::invalid
integer i,code
invalid=.true.
do while(invalid)
write(*,*)"please input a number belong to N"
read(*,"(A80)")string
invalid =.false.
do i=1,LEN_TRIM(string)
//!检查输入的字符是否有不包含0-9的字符
code=ichar(string(i:i))
if((code<ichar('0')).or.(code>ichar('9')))then
invalid=.true.
exit
end if
end do
end do
read(string,*)GetInteger
return
end function

这种文件还可以应用再动态改变输出格式,输出格式可以事先放在字符串里,程序运行的时候,动态改变字符串内容就可以改变输出格式,书上有代码实例,我就不写了,没啥意思,直接跳到下面去了。
namelist:它可以把一组相关变量封装在一起,输入/输出这组变量的时候,只要在write/read中的nml字段赋值要使用哪一个namelist就ok
program main
implicit none
integer::a=1,b=2,c=3
NAMELIST /na/ a,b,c
write(*,nml=na)
stop
end

namelist也可以用来输入数据,不过通常都会用来读取文件,不会在键盘输入中使用。
program main
implicit none
integer::a(3)
namelist /na/ a
open(10,file="list.txt")
read(10,nml=na)
write(*,"(3I2)")a
stop
end program
文件的应用,书上给了两个,有一个时要光盘上的数据,我没有光驱就不搞这个了,把这段代码看看就ok,主要跟着书上来一个图片读取:
program main
implicit none
integer,PARAMETER:: recl_unit=4
integer,PARAMETER::buffer_size=256*256
character::cbuffer(buffer_size)
integer:::ibuffetr(buffer_size)
integer:: error,i,code
open(10,file="photoname",form="unformatted",ACCESS="direct",recl=buffer_size/recl_nuit,status="old",iostat=error)
if(error/=0)then
write(*,*)"open photo"
stop
end if
read(10,recl=1)cbuffer
close(10)
do i=1,buffer_size
code=ichar(cbuffer(i))
if((code>0))then
ibuffetr(i)=code
else
ibuffetr(i)=code+256
end if
end do
do i=1,buffer_size
cbuffer(i)=char(255-:ibuffetr(i))
end do
open(10,file="photoname",form="unformatted",ACCESS="direct",recl=buffer_size/recl_nuit,status="replace")
write(10,recl=1)cbuffer
close(10)
stop "over"
end
试一下吧,我试试一张我喜欢的图片能不能成功:
啊这,vscode打不开我的图片,算了,只好作罢。
io流真的没啥难的,但我记得上大学的时候,看西开秦疆大神的网课,他那会说io可实现一切,所以说,io虽然不难,但是非常有用,要重视起来,尤其后面做数据处理的时候,老师时看重fortran处理速度快才让我学的,必须要处理文件,io就是基础了,还是灰常重要滴。
本文介绍了Fortran中的IO操作,包括基本的文件读写方法、使用字符串变量进行数据处理的技巧,以及通过namelist进行变量组管理的方式。文章还探讨了如何处理用户输入,并给出了一些实用的示例代码。
1万+

被折叠的 条评论
为什么被折叠?



