Fortran学习14:IO3

本文介绍了Fortran中的IO操作,包括基本的文件读写方法、使用字符串变量进行数据处理的技巧,以及通过namelist进行变量组管理的方式。文章还探讨了如何处理用户输入,并给出了一些实用的示例代码。

其实,文件的读取时非常简单的,就是两个很重要的命令,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就是基础了,还是灰常重要滴。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值