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

Fortran学习12:IO 1_第1张图片

 现在来仔细的聊一聊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’

Fortran学习12:IO 1_第2张图片

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

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

 

你可能感兴趣的:(Fortran,学习)