之前写程序的时候,我们经常会使用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,今天就到这里吧,简简单单的先学习一下基础,毕竟万丈高楼平地起嘛,明天没有看,开始学习对顺序文件的操作。