Fortran学习12:IO 1

之前写程序的时候,我们经常会使用read和write命令,这俩是最简单的io流命令,但是他们是有问题的,因为他们在读取之后,数据不能长期保存,这是个很恶心的问题,所以这个时候就需要文件来帮忙了。

Fortran读取文件有两种方式,一个是顺序读取,另一个是直接读取,把顺序读取想象成磁带的读取就行,只能从头到尾,直接读取则是在读写文件的时候,可以跳跃到任意位置来进行读写。

保存文件也有两种,很简单,保存为文本文件以及保存为二进制文件,大概就是这么多,下面就开始命令学习吧。

1、open命令,这个命令就是打开文件

open(unit=iounit, file=name,form=formatted iostat=ios, &
     status="old/new/replace/scratch/unknown", action="read/write/readwrite", access="sequential/direct"sequential/direct)
if ( ios /= 0 ) stop "Error opening file name"

UNIT必须是正整数,尽量要避免1、2、5、6,因为2、6是默认输入的位置(屏幕),1、5是默认输入的位置(键盘)。

form有两种,一种是formatted,另一种是unformatted,前者是用文本文件形式来保存,后者则用二进制文件格式来保存

status="old/new/replace/scratch/unknown"

其中,new表示这个文件原本不存在。是第一次打开

           old表示这个文件原本就存在

           replace表示如果文件以及存在,会覆盖掉之前的内容,如果文件不存在,就会生成一个新文件

          scratc表示带开一个暂存盘,现在不需要指定文件名称,程序会主动去取一个文件名,文件名是什么也不重要,暂存盘会在程序结束后自动删除

         unknow表示这个由编译器直接决定,通常会是replace的效果。

access="sequential/direct"

        sequential是顺序读写,direct是直接读写,

recl=length

        表示一次可以读出length长的数据

        Err=label:文件打开发生错误是,程序会跳跃到label所指的位置继续执行

iostat:

<0文件终止
>0读取出现错误
=0操作正常

blank:空格存在时所代表的意义

NULL空格表示没东西
ZERO空格会自动以0代入

position:

asis表示文件打开时的读取位置,缺省值是文件开头
rewind表示文件打开时的读取位置移到文件开头
append表示文件打开时的读取位置移到文件结尾

、pad:

yes格式化输入时,最前面的不足字段会以空格填满,yes是缺省值
no格式化输入时,不足的字段不会自动以空格填满

delim:

none输出纯字符
quote字符串会加上双引号
apostrophe字符串会加上单引号

举一个例子:

unit实际上是给后面的文件给一个代号,可以看到write(10,*)中的10 就对应着在这个文件里写入

program main
implicit none
integer :: i
open(unit=10,file='hello.txt')
do i=1,10
write(10,*)'Hello word!'
end do 
stop
end

 现在来仔细的聊一聊write和read吧:

read/write(unit=iounit, fmt="(format string)", iostat=ios, advance='NO') variables
if ( ios /= 0 ) stop "Write error in file unit iounit"

rec=record:直接读取文件的时候设置所要读写的文件模块位置

iostat:

<0文件终止
>0读取出现错误
=0操作正常

err=errlabel:指定读写错误的时候,会转移到的代码位置

end=endlabel:读写到文件末尾时,要转移到某行代码处来继续执行

advance:

yes缺省值,每读写一次会向下移动一行
no暂停自动换行的操作

size:size=count:只有advance=no时,才可以使用这个字段,会把这一次输出输入的字符数目设置给后面的整性变量

查询文件状态要用inquire命令:

inquire(file=filename, opened=ioopen, exists=ioexist, number=iounit)

opened=ioopen:是否打开

exists=ioexist:是否存在

number=iounit:所要查询的文件代号

还有很多的命令,可以多看看书

backspace(unit=number,err=errlabel,iostst=iostat)
//!文件读写位置回退
endfile(unit=number,err=errlabel,iostst=iostat)
//!吧目前文件的读写位置变成文件的结尾
rewind(unit=number,err=errlabel,iostst=iostat)
//!把文件读写位置倒回文件开头
close(unit=number,status=string,err=errlabel,iostst=iostat)
//!关闭文件

跟着书上试一下:

caution:刚刚才发现,上面的exists改成了exist

program main
    implicit none
    integer,PARAMETER::fileid=10
    LOGICAL alive
    CHARACTER(len=20)::filename
    WRITE(*,*)'filname:'
    read(*,"(A20)")filename
    inquire(file=filename,exist=alive)
    if(alive)then
     open(unit=fileid,file=filename)
     close(fileid,status='DELETE')
    else
        write(*,*)TRIM(filename),"doesn't exist"
     //!TRIM函数用来删除字符串后面的多余空格
    end if
stop "over"
end
//!如果文件存在就把他删除,不存在就报错
//!怎么删除的嘞?看没看到close里的status=‘DELETE’

刚开始把文件名写错了,我说怎么helloword.txt不存在,结果写成了hellowrd.txt。。。

ok,今天就到这里吧,简简单单的先学习一下基础,毕竟万丈高楼平地起嘛,明天没有看,开始学习对顺序文件的操作。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值