《格式化输出与文件》由会员分享,可在线阅读,更多相关《格式化输出与文件(39页珍藏版)》请在金锄头文库上搜索。
1、Fortran程序设计第四讲 基本I/O第四讲内容WRITE语句格式化输出 READ语句格式化读取 文件操作5.1 格式化输出WRITE (*,*) 是自由格式输出,也称表控输出INTEGER : i DO i=1,10 WRITE (*,*) sin(,i,)=,sin(3.141593*i/180) END DO WRITE (*,*) -1-2-3-4输出的数据不直观也不 美观 所以我们要采用格式输 出INTEGER : i DO i=1,10 WRITE (*,(10X,A4,I2,A2,F8.6) sin(,i,)=,sin(3.141593*i/180) END DO WRITE
2、(*,*) -1-2-3-4利用格式控制,可 以将输出按照自己 的需求排列,便于 分析数据5.2 格式化输出的基本格式有两种格式WRITE(*,100) a 100 FORMAT(I3)WRITE(*,(I3) a前面输出正弦表的程序也可以修改为:WRITE (*,200) sin(,i,)=,sin(3.141593*i/180) 200 FORMAT (10X,A4,I2,A2,F8.6)还可以修改为: WRITE (*,200),i,sin(3.141593*i/180) 200 FORMAT (10X, sin(,I2, )=,F8.6)格式化描述符整数I 实数F E ES 字符A 空
3、格X 跳转T 换行/5.3 整数的输出-I描述符I描述符用来描述整数数据的显示格式,形式为:rIw 或 rIw.mr 重复计数-表示这个格式重复的次数 w 域宽-输出使用的字符数 m 要显示的最小位数例:INTEGER : i=-12,j=4,k=-12345 WRITE (*,(2I5,I6,I10) i,i+12,j,k WRITE (*,(2I5.0,I6,I10.8) i,i+12,j,k WRITE (*,(2I5.3,I6,I5) i,i+12,j,k WRITE (*, (T1,A40) -1-2-3-4 整数数值在其域内右对齐 如果整数太大,用*显示 如果m值超过整数位数,就在
4、左侧用0补满INTEGER : i=-12,j=4,k=-12345 WRITE (*,100) i,i+12,j,k WRITE (*,101) i,i+12,j,k WRITE (*,102) i,i+12,j,k 100 FORMAT (2I5,I6,I10) 101 FORMAT (2I5.0,I6,I10.8) 102 FORMAT (2I5.3,I6,I5) WRITE (*, (T1,A40) -1-2-& 3-4上一个例子也可以写成这样,结果是一样的5.4 实数输出-F描述符rFw.dd表示小数点右边的位数 实数在其显示域内右对齐 如果d值小于数据的小数位数,那么显示前会被四舍
5、五入 如果d值超出数据的小数位数,那么在小数最后补齐足够的0 如果实数太大,给定的域放不下,那么用*填充12.345678 用下面的格式会输出什么? F10.8F12.8 F5.3 F5.25.5 实数输出-E描述符rEw.d和科学记数法不同,E描述法把实数规范到0.11.0 之间的一个数乘以10的幂 比如阿伏伽德罗常数用科学记数法为:6.02x1023 E表示是0.602x1024,显示在计算机上是0.602E+24如果数据的有效位数是7,用E表示的时候,w和d分别要取多少呢 ? w至少要14:1个字符用来表示尾数的符号,2个字符用于表示0和 小数点,7个字符表示实际的尾数,1个字符表示E,
6、1个字符表示指 数的符号,2个字符用于表示指数自身 0.dddddddE ee所以,用E表示的时候,要特别注意表示域的宽度问题, 一般至少满足如下表达式: wd+75.6 实数输出-ES描述rESw.dES描述和E描述的区别在于尾数的选取不同,ES描述 是用的科学记数法,尾数选取范围是1.010.0,这种 表示方式更适合科研和工程人员ES表示:d.dddddddE ee可以看出,同样宽度下,ES可以比 E多一个有效位6.1 字符-A描述rA 或 rAw rA 使用宽度与被显示字符数相同 rAw 使用w个宽度显示字符,w超出字符个数时, 右对齐,w不足时,只显示字符的前w个CHARACTER (
7、len=17) : string = This is a string. WRITE (*,100) string WRITE (*,101) string WRITE (*,102) string 100 FORMAT ( ,A) 101 FORMAT ( ,A20) 102 FORMAT ( ,A6)7.1 水平定位-X和T描述nXTc插入n个空格直接跳转到本行第c列注意不要让让打印域交叠了8.1 换行-/每个/换一行,/可以连续使用,表示 连续换多行9.1 格式描述符组的重复执行3I5 表示连续输出3个整数,每个位宽5如果有: I6,I6,F10.2,F10.2,I6,F10.2,F10
8、.2 可以写成: I6,2(I6,F10.2) 进一步 如果 I6,F10.2,A,F10.2,A,I6,F10.2,A,F10.2,A 写成 2(I6,2(F10.2,A) 这种是嵌套10 格式化输出举例REAL,PARAMETER : PI=3.141593 INTEGER : angle REAL : radian WRITE (*,10) angle,radian,sin(angle),cos(angle) 10 FORMAT (T5|,-|-|-|-|& &,/,T5,|,A5,|,3(A10,|) & &,/,T5,|,-|-|-|-|) DO angle=1,10radian=a
9、ngle*PI/180.WRITE (*,100) angle,radian,sin(radian),cos(radian)100 FORMAT (T5,|,I3, |,3(F5.2, |),/,&T5,|,-|-|-|-|) END DO11.1 格式化输入在READ中使用的描述符和前面所述差别不大格式化的输入很少用于键盘输入格式化输入一般配合输入文件,用来从文件 中读取数据 我们会结合文件操作来学习这个内容12.1 文件初步截止目前,我们接触到的程序都是小规模的但是,在具体应用中,输入的数据和输出的数 据量都非常的大我们不可能从键盘上一个个地键入大量的输入 数据,或者对着屏幕一条条分析输出
10、结果解决这个问题的办法是用文件:n文件是一种保存数据的标准结构,它由许多相 互关联的数据行组成,可以作为一个整体被存 取。文件中的每个信息行称为记录。nFortran可以一次一个记录地从一个文件中读 取信息或者向文件中写入信息。在Fortran中读写文件的方法:输入/输出单元(I/O单元,单元)nI/O单元与READ(*,*)和WRITE(*,*)语句中的 第一个星号对应n如果这个星号被I/O单元代号代替,那么相 应的读写设备将由该单元指定,替代标准 I/O设备n除此之外,其它格式与之前所学没有区别文件操作相关语句OPENCLOSEREADWRITEREWINDBACKSPACE12.2 OP
11、EN语句OPEN语句将一个文件和一个给定的I/O单元号关联OPEN(open_list)open_list包含一组子句,分别指定I/O单元号、文件 名和关于如何存取文件的信息暂时只介绍最重要的六项:UNITFILESTATUSACTIONIOSTAT打开一个文件的例子例: 打开一个文件input.dat,并将其连接到I/O单元8INTEGER : ierror OPEN (UNIT=8,FILE=input.dat,STATUS=OLD& &,ACTION=READ,IOSTAT=ierror)红色部分就是open_listUNIT子句UNIT=int_expr用来给文件指定一个I/O单元号例
12、如UNIT=8 在后续的语句中,就可以 WRITE(8,*) a,b,cFILE子句FILE=char_expr 要打开的文件的名字,用字符串表示STATUS子句STATUS=char_expr指定要打开文件的状态,char_expr可以取: OLD - 打开已经存在的文件 NEW - 新建一个文件 REPLACE- 新建一个并替换掉之前的 SCRATCH- 打开一个临时文件 UNKNOW ACTION子句ACTION=char_expr指定文件的读写权限:READ只能读取 WRITE只能写入 READWRITE读写都可以如果没有指定,那么文件打开后允许读写IOSTAT子句IOSTAT=int
13、_var返回OPEN语句的结果: OPEN语句如果成功执行,会给int_var赋值0如果不成功,相应错误的整数代码会赋值给 int_var更多的例子例: 打开一个文件output.dat,并将其连接到I/O单元18INTEGER : ierror OPEN (UNIT=18,FILE=output.dat,STATUS=& &NEW,ACTION=WRITE,IOSTAT=ierror)nSTATUS=NEW子句指明文件是新文件,如果文件 已经存在,那么OPEN语句就给变量ierror返回一个 错误代码,确保不会覆盖掉已有的文件n如果用STATUS=REPLACE,情况就不一样例 打开一个临时
14、文件 OPEN (UNIT=12,STATUS=SCRATCH,& &IOSTAT=ierror)n临时文件由程序建立,当文件被关闭或程序终 止运行时,它将被自动删除。n这类文件可在程序运行时保存中间结果,注意 程序结束后,就不再可用了。12.3 CLOSE语句CLOSE语句关闭一个文件并释放与之关联的 单元号CLOSE(close_list)nclose_list也是一个子句序列,这里我们暂时只 掌握不可少的子句:指定I/O号n在关闭一个非临时文件后,随时还可以用 OPEN再次打开n再次打开可以分配与上次一样或不一样的单元 号nCLOSE释放出来的单元号可以分配给其它文 件nCLOSE(UNIT=12)12.4 磁盘文件的读写 以自由格式从文件input.dat中读取变量x,y,zOPEN (UNIT=8,FILE=input.dat,STATUS=&OLD,IOSTAT=ierror)READ (8,*) x,y,z以特定格式向文件output.dat写入变量x,y,z的值OPEN (UNIT=9,FILE=output.dat,STATUS=&REPLACE,IOSTAT=ierroe)WRITE (9,100) x,y,z100 FORMAT (x