二进制文件Fortran读写专题

合集下载

关于二进制文件读写的详细解说

关于二进制文件读写的详细解说

先介绍函数,我们一共要用到三个函数,fopen,fread,fwrite。

二进制读写的顺序是用fopen以二进制方式打开读写文件,然后使用fread和fwrite两个函数将数据写入二进制文件中。

下面我们看看一个拷贝程序的源码:2中,注意fread的返回值,这个值需要在fwrite的时候将会用到。

后面是关于fopen,fread,fwrite三个函数的详细说明。

fopen(打开文件)相关函数open,fclose表头文件#include<stdio.h>定义函数FILE * fopen(const char * path,const char * mode);函数说明参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

mode有下列几种形态字符串:r 打开只读文件,该文件必须存在。

r+ 打开可读写的文件,该文件必须存在。

w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。

若文件不存在则建立该文件。

w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。

若文件不存在则建立该文件。

a 以附加的方式打开只写文件。

若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

a+ 以附加方式打开可读写的文件。

若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。

不过在POSIX系统,包含Linux都会忽略该字符。

由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。

返回值文件顺利打开后,指向该流的文件指针就会被返回。

二进制文件的读写以及相关心得

二进制文件的读写以及相关心得

二进制文件读写分析有关TXT文件以及bin文件处理的测试代码int main(){//fstreamfile("D:\\test.dat",ios_base::in|ios_base::out|ios_base::app);fstream file;file.open("D:\\test1.dat",ios_base::out);{int temp[10] ={0x11,0x13,0x14,0x1F,0x1D,0x11,0x11,0x12,0x11,0x11};int temp1[10];file.write((char *)temp,sizeof(temp));file.close();file.open("D:\\test1.dat",ios_base::in);file.read((char *)temp,sizeof(temp));unsigned int i;cout<<sizeof(temp)<<endl;for(i = 0;i < sizeof(temp)/sizeof(unsigned int);i++){temp1[i] = temp[i];cout<<temp[i]<<endl;}file.close();file.open("D:\\test1.dat",ios_base::out);temp1[6] = 0x16;file.write((char *)temp1,sizeof(temp));file.close();}file.open("D:\\test1.dat",ios_base::out|ios_base::app);unsigned char temp[10] = {'a','b','a','a','a','d','a','C','a','a'}; test *test1 = (test *)malloc(sizeof(test));test1->projectId = 'U';test1->password = 0x12;for(int i = 0;i < 10;i ++){test1->someThings[i] = temp[i];}test1->sm = (unsigned long)0x41;test1->fuck = 'M';file.write((char *)test1,sizeof(test));file.close();test *test2 = (test *)malloc(sizeof(test));file.open("D:\\test1.dat",ios_base::in);file.seekg(0x28);file.read((char *)test2,sizeof(test));for(int i = 0;i < 10;i ++){cout<<test2->someThings[i]<<endl;}file.close();return 0;}有关bin文件处理的测试笔记<1> 我一直以为自己很熟悉如何使用C/C++中的二进制文件,可今天测试的时候突然发现程序生成的二进制文件和文本文件一样。

二进制文件Fortran读写专题

二进制文件Fortran读写专题
GrADS binary数据
GrADS最基本,我们最易准备
常用后缀 .dat .grb .bin ……
需要.ctl文件一起使用
是无格式文件 (form=‘unformatted’)
若用Fortran读写
▪ 存取方式
• 直接存取(access=‘direct’)
GrADS读取快速
• 顺序存取(access=‘sequential’) 需在.ctl中说明
8
FORTRAN示例二:每次写入一个记录
Var1
Var2
Var3
VarN
T1
……
一个 记录
Var1
Var2
VaVar2
Var3
VarN
T3
……
2017年9月11日星期一
9
FORTRAN示例二:每次写入一个记录
每次写入一个数据
每次写入一个记录(平面)
2017年9月11日星期一
t=1
then levels 925, 850, 700, 600, 500, 400, 300, 250, 200, 150, 100, 70, 50, 30, 20, 10
根据Fortran程序,
Time 1, Level 1000, Variable qa then levels 925, 850, 700, 600, 500, 400,
▪ 数据类型real*4,也就是4个字节的实型数
GrADS binary数据
GrADS视该数据集为一个五维数组,这五维的变化顺序为:
x(lon) y(lat) z(lev) vars(不同变量) t(time)
这是GrADS缺省的数据存放次序,读取和调用的效率最高。
例:假如我们希望创建一 binary数据集,共4个变量, 每个变量有4维(x,y,z,t),则以 x,y维构成水平网格的二维数 组片的存放顺序如下:

fortran用法总结

fortran用法总结

fortran用法总结我的Fortran基本用法小结周日, 10/14/2007 - 21:00 — gator一、说明二、概述三、数据类型及基本输入输出四、流程控制五、循环六、数组七、函数八、文件一、说明本文多数内容是我读彭国伦《Fortran 95 程序设计》的笔记。

只读到第九章,主要是3~9章,都是最基本的用法(原书共16章)。

这里主要摘录了我看书过程中总结的一些Fortran和C不同的地方,主要是语法方面。

希望这份笔记能够给学过C但没有接触过Fortran的同学带去一些帮助。

要想得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础,看完前九应该很快的,花一两天就行了。

觉得如果耐心看完本文,基本功能应该也可以顺利用起来了。

外,由于我之前没有用过Fortran,这次为了赶文档看书又看得很粗浅,大多数东西看过之后都没得及仔细想,只是按着作者的意思去理解。

所以这份笔记还处于纸上谈兵的层次。

如果有不妥的方,希望大家指正。

谢谢!文中蓝色的部分是程序代码,!后面的内容为注释。

二、概述1、名词解释Fortran=For mula Tran slator/Translation一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。

的确,从一开始,IBM设计的时候就是为了方便数值计算和科学数据处理。

设计强大的数组操作就是为了实现这一目标。

ortran奠定了高级语言发展的基础。

现在Fortran在科研和机械方面应用很广。

2、Fortran的主要版本及差别按其发展历史,Fortran编译器的版本其实很多。

现在在广泛使用的是Fortran 77和Fortran90。

ortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式,所以编程时推荐使用90。

鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保证能够看77程序。

以下是77和90的一些格式上的区别。

Fortran之open,write,read,inquire,Namelist 使用

Fortran之open,write,read,inquire,Namelist 使用

FORM='FORMATTED' OR 'UNFORMATTED'
FORM字段只有两个值可以设置:
FORM='FORMATTED' “文本文件”格式来保存
FORM='UNFORMATTED' “二进制文件”格式保存
这一栏不给定时候的默认值是: FORM='FORMATTED'
NAMED=named 查询文件是否取了名字,也就是检查文件是否为临时保存盘,返回值为逻辑数。
ACCESS=access 检查文件的读取格式,返回一个字符串,可以是:
'SEQUENTIAL' 代表文件使用顺序读取格式
'DIRECT' 代表文件使用直接读取格式
2. 文件的操作:
----------------------------------
open的使用:使用open命令打开文件之后,就可以对文件来做输入输出。
example:
program ex0901
impicit none
open(unit=10, file='hello.txt') ! 打开hello.txt文件, unit指定文件代码,file指定文件名称。
stat>0 表示读取操作发生错误。
stat=0 表示读取操作正常。
stat<0 表示文件终了。
ERR=errlabel 指定在读写过程中发生错误时,会转移到某个行代码来继续执行程序。
END=endlabel 指定在读写到文件末尾时,要转移到某个行代码来继续执行程序。
!这一栏不给定时,默认为STATUS='UNKNOWN'。

6 Fortran 程序设计6-文件

6 Fortran 程序设计6-文件

6 Fortran 程序设计6-文件6 Fortran 程序设计6-文件在Fortran编程中,文件操作是非常重要的一部分。

通过文件操作,我们可以方便地读取和写入数据,对数据进行处理和分析。

本文将介绍Fortran中的文件操作相关内容。

1. 文件的概念和分类文件是计算机中用来存储数据的一种存储介质,可以是硬盘、光盘或其他存储设备。

在Fortran中,常见的文件类型包括文本文件和二进制文件。

文本文件是以文本的形式存储数据的文件,其中的数据以可打印字符的形式表示。

文本文件可以使用文本编辑器打开并查看其内容。

二进制文件以二进制形式存储数据的文件,其中的数据以二进制位表示。

二进制文件一般不能直接使用文本编辑器打开查看,需要通过特定的程序进行读取和解析。

2. 文件操作的基本过程文件操作的基本过程包括打开文件、读取或写入文件、关闭文件。

下面分别介绍这三个步骤的具体内容。

2.1 打开文件在Fortran中,可以使用`OPEN`语句打开一个文件。

打开文件时需要指定文件名、打开模式和文件单元号。

OPEN(unit=文件单元号, file=文件名, status=打开模式)其中,文件单元号是一个整数值,用来标识一个打开的文件。

文件名是一个字符串,表示要打开的文件的路径和文件名。

打开模式可以是以下几种:- `READ`:只读模式,用于从文件中读取数据。

- `WRITE`:只写模式,用于向文件中写入数据。

如果文件不存在,则创建一个新文件;如果文件已存在,则清空文件内容。

- `APPEND`:追加模式,用于向文件中写入数据。

如果文件不存在,则创建一个新文件;如果文件已存在,则在文件末尾追加写入数据。

- `READWRITE`:读写模式,既可以读取数据,也可以写入数据。

2.2 读取或写入文件在打开文件之后,可以使用`READ`和`WRITE`语句进行读取和写入操作。

读取文件时,可以使用以下语句:READ(unit=文件单元号, ) ! 读取文件中的数据写入文件时,可以使用以下语句:WRITE(unit=文件单元号, ) ! 将数据写入文件在读取或写入文件时,需要注意数据的格式。

二进制读写文件

二进制读写文件

二进制读写文件二进制是一种用于表示和存储数据的编码系统,它由0和1两个数字组成。

在计算机中,所有的数据都以二进制形式存储和传输。

在本文中,我们将探讨如何使用二进制读写文件,以及它的一些应用。

让我们看看如何使用二进制读取文件。

在计算机中,文件是一系列的字节组成的。

每个字节由8个二进制位组成。

使用二进制读取文件时,我们可以逐字节地读取文件内容,并将其转换为相应的二进制表示。

在大多数编程语言中,都提供了读取二进制文件的方法和函数。

我们可以使用这些方法打开文件,并按字节读取文件内容。

通过这种方式,我们可以读取文件中的所有数据,包括文本、图像、音频等等。

接下来,让我们探讨如何使用二进制写入文件。

与读取文件相反,使用二进制写入文件时,我们可以将数据以二进制形式写入文件中。

同样,我们可以按字节写入文件内容,将其转换为相应的二进制表示。

使用二进制写入文件时,我们可以创建一个新文件或覆盖已有文件。

我们可以将数据以二进制形式写入文件,并将其保存在计算机的存储介质中。

这样,我们就可以在以后的时间里读取这些数据,或者与其他人共享这些数据。

除了基本的读写文件操作,二进制还有许多其他的应用。

例如,在网络传输中,数据通常以二进制形式传输。

当我们通过互联网发送或接收数据时,数据会被转换为二进制形式,并通过网络传输。

在接收方那里,数据会被重新转换为其原始形式。

另一个应用是在计算机中存储图像和音频。

图像和音频文件通常很大,因为它们包含了大量的数据。

使用二进制存储这些文件可以节省存储空间,并提高读写效率。

在读取图像和音频文件时,我们可以按字节读取文件内容,并将其转换为相应的二进制表示。

二进制还可以用于存储和传输其他类型的数据,如视频、压缩文件等。

通过将数据转换为二进制形式,我们可以有效地存储和传输这些数据,同时保持数据的完整性和准确性。

总结一下,二进制是一种用于表示和存储数据的编码系统。

通过使用二进制读写文件,我们可以读取和写入文件内容,并以二进制形式存储和传输数据。

FORTRAN 读取二进制文件

FORTRAN 读取二进制文件

FORTRAN 读取二进制文件两种打开方式:直接打开(access='direct')、流(access='stream',老版FORTRAN没有)1、直接打开方式把二进制文件看成一个一个的记录,每个记录的大小为RECL*4字节,READ 中的REC是指读第几个记录,每次只能读RECL*4字节的数据(即一个记录大小)。

程序中RECL=4,READ(2,REC=806)是只读第806个记录,每个记录大小为16字节,那个第806个记录的起始位置是805*16+1=12881。

定位错误,所以读出的数据也是错的。

SEGY的卷头和道头,以及地震道数据,每个数据的长度为2字节或4字节,所以16字节的记录长度不太合适,所以把RECL改为1,即记录大小为4字节,这个时候第806个记录起始位置为805*4+1=3221。

program maininteger*2 num1,num2open(2,file='test.sgy',status='old',access='direct',recl=1)read(2,rec=806) num1,num2print*,num1,num2endnum1即为采样点数。

如果使用RECL=4,即每个记录大小为16字节,3220/16=201.25,也就是要读的目标数据在第202个记录上,但不是第202个记录的起始位置。

16*201=3216,即第202个记录的起始位置是3217,所以要读三个INTEGER*2,第三个才是目标数据。

program maininteger*2 num1,num2,num3open(2,file='test.sgy',status='old',access='direct',recl=4)read(2,rec=202) num1,num2,num3print*,num1,num2,num3endnum3才是采样点数,而num1应该就是采样间隔。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

……
4
输出GrADS数据文件的次序
用循环写grads的二进制数据, 从内循环到外循环依次是:
▪ x (lon) → y (lat) → z (lev) → vars (不同变 量) → time
这是GrADS缺省的数据存放次序,读取和调用数 据的效率最高。
2017年9月11日星期一
5
输出GrADS数据文件的次序
17 2017/9/11
Fortran->CTL
2017年9月11日星期一
dset d:/mydata/test.grd title This a GrADS test data undef -9999.0 xdef 144 linear 0 2.5 ydef 73 linear -90 2.5 zdef 17 levels 1000 925 850 700 600 500 400 300 250 200 150 100 70 50 30 20 10 tdef 365 linear 00:00z01jan2000 1dy vars 9 ps 0 99 Sea surface pressure (hPa) ta 17 99 air temperature (degC) qa 8 99 special humidity (kg/kg) ua 17 99 Zonal winds (m/s) va 17 99 Meridional winds (m/s) wa 12 99 vertical winds (pa/s) zg 17 99 geopotential height (gpm) ts 0 99 t2m temperature (degC) P 0 99 precipitation (mm) endvars 18
GrADS binary数据
GrADS最基本,我们最易准备 常用后缀 .dat .grb .bin …… 需要.ctl文件一起使用 是无格式文件 (form=‘unformatted’) 若用Fortran读写 ▪ 存取方式 • 直接存取(access=‘direct’) GrADS读取快速 • 顺序存取(access=‘sequential’) 需在.ctl中说明 ▪ 数据类型real*4,也就是4个字节的实型数
2017年9月11日星期一
11
FORTRAN示例三:同时写入地表变量和气压层变量
PS ta va zg
T1
PS ta va
……
zg
一个 记录
T2
……
va zg
PS
ta
T3
2017年9月11日星期一
……
12
FORTRAN示例三: 同时写入地表变量和 气压层变量
2017年9月11日星期一
13
FORTRAN示例四:气压层不同
GrADS binary数据
GrADS视该数据集为一个五维数组,这五维的变化顺序为:
x(lon) y(lat) z(lev) vars(不同变量) t(time)
这是GrADS缺省的数据存放次序,读取和调用的效率最高。
Time 1, Variable 1, Each vertical level from bottom to top Time 1, Variable 2, Each vertical level from bottom to top Time 1, Variable 3, Each vertical level from bottom to top Time 1, Variable 4, Each vertical level from bottom to top Time 2, Variable 1, Each vertical level from bottom to top Time 2, Variable 2, Each vertical level from bottom to top Time 2, Variable 3, Each vertical level from bottom to top Time 2, Variable 4, Each vertical level from bottom to top ……
记录序号
2017年9月11日星期一
8
FORTRAN示例二:每次写入一个记录
Var1 Var2 Var3 VarN
T1
Var1 Var2 Var3
……
VarN
一个 记录
T2
……
VarN
Var1
Var2
Var3
T3
2017年9月11日星期一பைடு நூலகம்
……
9
FORTRAN示例二:每次写入一个记录
每次写入一个数据 每次写入一个记录(平面)
PS ta qa zg
T1
PS ta qa
……
zg
一个 记录
T2
……
qa zg
PS
ta
T3
2017年9月11日星期一
……
14
FORTRAN示例四:气压层不同
2017年9月11日星期一
15
FORTRAN示例五:多个变量
2017年9月11日星期一
16
Time 1, Level ? , Variable PS t=1 Time 1, Level 1000, Variable ta then levels 925, 850, 700, 600, 500, 400, 300, 250, 200, 150, 100, 70, 50, 30, 20, 10 根据Fortran程序, Time 1, Level 1000, Variable qa 如何写出ctl文件? then levels 925, 850, 700, 600, 500, 400, 300 t = 2, 3…365 Time 1, Level 1000, Variable ua then levels 925, 850, 700, 600, 500, 400, 300, 250, 200, 150, 100, 70, 50, 30, 20, 10 Time 1, Level 1000, Variable va Time 2, Level ? , Variable Ps then levels 925, 850, 700, 600, 500, 400, …………………… 300, 250, 200, 150, 100, 70, 50, 30, 20, 10 Time 2, Level ? , Variable P Time 1, Level 1000, Variable wa Time 3, Level ? , Variable Ps then levels 925, 850, 700, 600, 500, 400, …………………… 300, 250, 200, 150, 100 Time 3, Level ? , Variable P Time 1, Level 1000, Variable zg Time 4, Level ? , Variable Ps then levels 925, 850, 700, 600, 500, 400, …………………… 300, 250, 200, 150, 100, 70, 50, 30, 20, 10 Time 4, Level ? , Variable P Time 1, Level ? , Variable TS Time 5, Level ? , Variable Ps Time 1, Level ? , Variable P …………………… Time 365, Level ? , Variable P
一个点 (IX,IY)
2017年9月11日星期一
一个 记录
10
recl=:一次写入的数据量,与Fortran编辑单位有 关。
▪ 以字节数为单位:需要*4,recl= 144*73*4(字节) ▪ 以数据个数为单位,不需*4,recl= 144*73
recl与rec有关联 不同维数的循环嵌套顺序 (lon lat lev 不同变量 time ) (x y z 不同变量 t ) (内循环-------------外循环)
2017年9月11日星期一 6
二进制Binary数据文件存储结构
Var1 Var2 Var3 VarN
T1
Var1 Var2 Var3
……
VarN
T2
……
VarN
Var1
Var2
Var3
T3
2017年9月11日星期一
……
7
FORTRAN示例一:每次写入一个数据
无格式存储 直接存储
记录长度 记录序号 TIME循环 变量循环 LEV循环 LAT循环 LON循环
其中任何一(几)维都可省略。例: ▪ DATA ( 144, 73, 17, 6, 365 ) ▪ DATA(144,73,17,365) ▪ DATA(144,73,17) ▪ DATA(6,365) ▪ DATA(365) 在生成原始数据文件时,无论用工作站还是PC机, 无论是用FORTRAN语言还是用C 语言,所生成 的数据的格式都要求是无格式(unformatted)直 接(direct)记录格式,不允许在记录中加入描述 符,如记录开始、记录结束、换行符等。
层次1 (底) 层次2
纬圈1 (南) 纬圈2
西
……
时间n
……
变量n
……
层次n (顶)
……
纬圈n (北)

3
二进制Binary数据文件存储结构
Var1 Var2 Var3 VarN
T1
Var1 Var2 Var3
……
VarN
一个 记录
T2
……
VarN
Var1
Var2
Var3
T3
2017年9月11日星期一
相关文档
最新文档