c++的open函数实现文件只保存一次写_天啊...我可不想写 FORTRAN...但是...唉...

Fortran作为一门运算效率较高古老的高级语言,在气象领域拥有着不低的影响力。作为一门独立发展出来的高级语言,其和C语言序列中的很多操作都是不通用的。小编也是在写这篇文章时才忽然意识到这点,原来Fortran是和C平级的,高人竟在我身边!

    那么,使用Fortran语言读写文件又有哪些要注意的呢?一起来学习吧~

Fortran中对文件的读写操作主要通过open,read,write三个函数实现。需要注意的是,不同于自动生成文件识别码的MATLAB、Python等语言,Fortran的文件识别码需要自行指定。(即open等文件操作函数中的UNIT项)。Fortran预定义了4种外部文件(设备),在定义的时候应当尽量避免:

设备号

连接的设备

星号(*)

总是键盘和显示器

0

缺省状态下是键盘和显示器

5

缺省状态下是键盘

6

缺省状态下是显示器

 但在实际应用时,不避开这几个数字也不会产生太大影响。只需要注意对同一个文件进行操作时,open和read、write、close函数中的文件标号相同即可。

open函数中,其可选项为:

open([UNIT=]unit[,ACCESS=access][,ACTION=action][,BLANK=blanks][,BLOCKSIZE=blocksize][,CARRIAGECONTROL=carriagecontrol][,DELIM=delim][,ERR=err][,FILE=file][,FORM=form][,IOFOCUS=iofocus][,IOSTAT=iostat][,PAD=pad][,POSITION=position][,RECL=recl][,SHARE=share][,STATUS=status])

UNIT(unit):设备号说明。必须为正整数,当unit为第一项时,书写过程中常常省略“UNIT=”。

ACCESS(access):存取方式说明。可选择:

        append     追加方式(在文件后继续写入)

        sequential 顺序访问方式

        direct     直接访问方式(或随机访问,类似python中字典、集合类型的操作)

        当省略此说明项时为顺序访问方式。

ACTION(action):描述文件的读写属性,可选择:

        read       文件为只读方式打开

        write      文件为只写方式打开

        readwrite  文件为可读写方式打开

       当省略此说明项时,文件打开顺序:READWRITE->READ->WRITE

BLANK(blank):说明数据格式输入字段中空格的含义。可选择:

        null    空格忽略不计,相当于在格式描述符中的BN编辑符

        zero    空格处理成数字0,相当于BZ编辑符

        当省略此说明项时为zero。此说明只能用于格式输入。

BLOCKSIZE(blocksize):指定以字节为单位的设备缓存的大小,默认值为一4字节整数。

CARRIAGECONTROL(carriagecontrol):指明处理文件中的第一个字符的方式。可选择:

        fortran    对第一个字符作一般的Fortran解释

        list       指出在文件的每两个记录之间有—个空格

        默认状态下,对于连接到打印机和显示器这样的设备,设置值为fortran,对于连接到文件的设备,设置值为list。当FORM被设成unformatted和binary时,其值被忽略。

DELIM(delim):指明分隔直接列表或格式化名称列表记录的方式。可选择:

        apostrophe 用单撇号(’)分隔

        quote      用双撇号(”)分隔

        none       不用分隔符

ERR(err):出错处理说明。其值是同一程序中的一条语句的标号,当OPEN语句执行出错时执行此语句。如果省略该项,则出错时给出出错信息并终止运行。

FILE(file):文件名。由于Fortran语言的编码问题,注意文件路径中尽量不要使用中文。

FORM(form):记录格式说明。可选择:

        formatted    记录按有格式存放。

        unformatted  记录按无格式存放。

当省略此说明项时为:对顺序文件是有格式的;对直接文件是无格式的。

IOFUS(iofus):指出一个新Quickwin子窗口是否为活动窗口,其值为逻辑值。缺省值为真。

IOSTAT(iostat):出错状态说明。iostat是—个缺省长度为4的整形变量。当执行此open语句时系统给变量赋值:

        零      没有发生错误

        负数  文件结尾

        正数  发生错误,其值视具体计算机系统而定

        若省略该项则没有此功能。

PAD(pad):从格式化文件中记录的数据少于要读取的数据时,是否用空格来填充没有从记录中读到数据的变量。

        yes        填充(默认值)

        no         不填充

POSITION(position):指定打开顺序文件的访问位置。

        asia       已被连接的文件的访问位置是固定的,未被连接的文件的访问位置是文件的开始处。可选择:

        rewind     把文件的访问位置定在文件的开始处(文件己存在)。

        append     把文件的访问位置定在文件的末尾处(文件己存在)。

        对于一个新文件,文件的访问位置总是被定在文件的开始处。

SHARE(share):指明当文件打开时是否实现文件的锁定。可选择:

        denyrw     动态读写模式。不允许其他的进程打开这个文件。

        denywr     动态写模式。不允许其他的进程以写的方式打开这个文件。

        denyrd     动态读模式。不允许其他的进程以读的方式打开这个文件。

        denynone   默认的非动态模式。允许其他的进程打开这个文件。

STATUS(status):文件状态说明。

        old:表示指定的文件是已经存在的老文件。这一状态一般用于读操作,如果用于写操作则重写文件,原文件内容将被覆盖。如果指定的文件并不存在,则系统将给出出错信息。

        new:表示指定的文件尚不存在。执行OPEN语句时将在磁盘上建立该文件并使其状态改变为OLD。NEW状态一般用于写操作。如果指定的文件名已经存在将给出出错信息(有的系统不给出信息而是把这个已经存在的文件冲掉使原来的内容不复存在)。

        scratch:表示与设备号相连接的文件在关闭时将被自动删除。注意:此状态不能与FILE说明共存,只能用于由计算机系统指定的文件名,使该文件作为程序运行过程中的一个临时性文件。

        replace:替换一个有相同名字的文件,如果没有同名的文件存在,将产生一个新文件。

        unkown:表示文件可以是已存在的或不存在的。系统打开文件状态的次序为:old->new->创建新文件。status的设置值只影响磁盘文件,像键盘和显示器这样的设备将忽略这一设置。

        若省略该项时默认的状态为unknown。

 是不是已经听晕了?等等等等以上种种暂时都可以忘记了,因为在实际使用时,通常用法是以下几种:

有格式文件:

    新文件:

open( 1, file = '...', status = 'new', form = 'formatted' )

    OR

    旧文件:

open( 1, file = '...', status = 'old')

无格式/顺序文件:

    新文件:

open( 1, file = '...', status = 'new', form = 'unformatted', access = 'sequential' )

    OR

    旧文件:

open( 1, file = '...', status = 'new', form = 'unformatted' )

无格式/直接文件:

   open( 1, file = '...', status = 'new', form = 'unformatted', access = 'direct', recl = ... )

■ AUTUMN 

    由于Fortran遗世独立的特性,因此其格式化字符的方式也显得特立独行,其格式化字符的方式为:

符号

使用对象

I

整数

F

实数

E

实数,指数表示法(非标准科学计数法)

ES

实数,标准科学计数法

A

字符

L

逻辑数

X

插入空格

T

移动至同一数据行中某一字符位置

/

换行

符号

用途

c

  一行中的第c个字节位置

d

用于实数,输入或输出的小数位数,不足则四舍五入

m

至少输出的位数,若为2,则至少输出两位,即是变量的字符数小于2,也要输出两位

n

插入空格的数目

r

 描述符的使用次数,如2I2,I2格式输出两次。*号表示无限次重复直到结束

w

域宽,输入或输出占用的字符数,可以理解成是放字符的有效空间

表格来自https://blog.csdn.net/weixin_43780543/article/details/89928567,有改动。

其基本语法为:

rIw.m、rEw.d、rESw.d、rFw.m、rLw、rA 或 rAw。

其他特殊用法:

nX:输出位置向右移动n位。

read(1,” (19XF7.2)”)!跳过前19个字符,再以总域宽7,保留小数点后两位的格式读取。write(*,"(5X,I3)") 100) !将先填5个空格,再输出整数。

Tc:表示将输出位置移动到本行中的第c个字节。

100 FORMAT( '  ' , T10 , I3) !先跳到本行中第10个字符位置,然后输出a变量

打开对应文件,经历一系列一系列的格式设置之后,就可以:

read(1,100) a!1为文件号,100为之前设置格式format行的标识,a为所需读出的变量

同理,可以写入:

write(1,100) a!多个变量之间可用逗号,隔开

好了!大功告成,最后只要记得关闭打开的文件:

close(1)

恭喜,你已经完成了一次成功的读写流程!基本知识学完了,来下面这些链接学习一些复杂技巧吧:

微信不能添加外部超链接,请复制链接至浏览器食用!

c6b1e097c22143991571e61175ccf777.gif

Fortran 究竟如何读取nc(netcdf)数据:(by:游子)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=11807

Netcdf文件格式了解及如何创建、读取:(by:godenflame135)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=4904

用Fortran读nc数据的程序:(by:wlzhongouc)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=4731

fortran读取nc数据文件:(by:xu850202)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=8416

分享个用fortran读nc文件的源程序(已修复):(by:残月)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=988

大型机Linux系统Fortran读取nc文件:(by:小哥8号)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=95180

[求助]fortran读取txt文件 读取的时候怎么跳过开头数据信息:

http://bbs.06climate.com/forum.php?mod=viewthread&tid=10065

文件中有空行的fortran处理方法:(by:mofangbao)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=1442

[求助] 用Fortran读写CSV文件:

http://bbs.06climate.com/forum.php?mod=viewthread&tid=67184

气象数据处理脚本篇(二):批处理:(by:雪花纷飞)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=8060

fortran生成二进制数据(.dat)之后自动生成ctl文件:(by:虫儿飞)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=31250

Fortran版diamond4转grads的源程序:(by:mofangbao)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=1598

Fortran实现批量处理的方法总结(读取一个目录下所有文件)(支持WIN7):(by:mofangbao)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=3079

利用探空资料和micaps第五类数据格式绘制历史探空图:(by:流觞曲水)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=16026

(批处理程序)MICAPS第五类数据:TLOGP和站点剖面图数据,Windows和Linux:(by:ljh110011)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=68533

Micaps一类数据的fortran批处理:(by:mofangbao)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=6473

Micaps第二类转GrADS的fortran源代码及其作图:(by:mofangbao)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=845

给大家共享读取SWAN的 QPE QPF 数据的FORTRAN代码:(by:☆why)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=22480

OLR资料说明及相应的FORTRAN读入程序:(by:love2100)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=6915

COSMIC数据读取和计算可降水量:(by:ryeyang)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=25128

[求助]请大家帮忙看一个FORTRAN程序!我想用FORTRAN程序读取FY2E GPF文件……

http://bbs.06climate.com/forum.php?mod=viewthread&tid=7525

Fortran中binary和unformatted,以及要回避的坑:(by:ljh110011)

http://bbs.06climate.com/forum.php?mod=viewthread&tid=91979

5b8a195eeabaaddcef1c2c0538f3f54f.gif

本期内容到此结束!意犹未尽?

欢迎到家园Fortran板块,一起玩耍吧!

http://bbs.06climate.com/

排版:泰日印的三角恋

6aaec803d91ea2eeae66e8a0026aa48f.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Fortran的直接生成三维随机高斯分布的代码,并将结果保存为.dat文件: ```fortran program generate_gaussian_3d implicit none integer, parameter :: N = 1000 ! 生成的随机数数量 real(kind=8), parameter :: mu(3) = [0.0, 0.0, 0.0] ! 均值 real(kind=8), parameter :: sigma(3) = [1.0, 2.0, 3.0] ! 标准差 real(kind=8), dimension(N, 3) :: data ! 存储生成的随机数 integer :: i call random_seed() ! 初始化随机数种子 ! 生成随机数 call generate_gaussian_random_3d(data, mu, sigma) ! 保存为dat文件 call save_data_3d(data, 'gaussian_3d.dat') end program generate_gaussian_3d subroutine generate_gaussian_random_3d(data, mu, sigma) implicit none real(kind=8), dimension(:,:), intent(out) :: data ! 存储生成的随机数 real(kind=8), dimension(:), intent(in) :: mu, sigma ! 正态分布的参数 integer :: i real(kind=8) :: u1, u2, u3, z1, z2, z3 do i = 1, size(data, 1) call random_number(u1) call random_number(u2) call random_number(u3) z1 = sqrt(-2.0 * log(u1)) * cos(2.0 * acos(-1.0) * u2) z2 = sqrt(-2.0 * log(u1)) * sin(2.0 * acos(-1.0) * u2) z3 = sqrt(-2.0 * log(u3)) * cos(2.0 * acos(-1.0) * u3) data(i, 1) = mu(1) + sigma(1) * z1 data(i, 2) = mu(2) + sigma(2) * z2 data(i, 3) = mu(3) + sigma(3) * z3 end do end subroutine generate_gaussian_random_3d subroutine save_data_3d(data, file_name) implicit none real(kind=8), dimension(:,:), intent(in) :: data ! 存储要保存的数据 character(len=*), intent(in) :: file_name ! 文件名 integer :: i, j integer, parameter :: N = size(data, 1) integer, parameter :: unit_num = 10 open(unit=unit_num, file=file_name, status='replace') do i = 1, N do j = 1, 3 write(unit_num, '(F8.4)') data(i, j) end do end do close(unit_num) end subroutine save_data_3d ``` 在这个代码中,`generate_gaussian_random_3d` 子程序使用直接生成高斯分布随机数的方法生成了三维的随机数。在每次循环中,通过调用 `random_number` 生成三个均匀分布的随机数 u1、u2 和 u3。然后,根据直接生成高斯分布的公式,计算出三个服从标准正态分布的随机数 z1、z2 和 z3。最后,根据给定的均值 mu 和标准差 sigma,计算出最终的服从高斯分布的随机数,并存储到 data 数组中。 `save_data_3d` 子程序用于将 data 数组中的数据保存为.dat文件。在每次循环中,将三维随机数的每个分量按照指定格式文件中。 请注意,这个示例中的标准差 sigma 是一个一维数组,可以为每个维度设置不同的标准差。保存的.dat文件将包含 N 行,每行包含三个数据,分别代表三个维度上的随机数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值