二进制文件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值。
返回值文件顺利打开后,指向该流的文件指针就会被返回。
二进制文件Fortran读写专题

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)
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 ……
8
FORTRAN示例二:每次写入一个记录
Var1
Var2
Var3
VarN
T1
……
一个 记录
Var1
Var2
Var3
VarN
T2
……
Var1
Var2
Var3
VarN
T3
……
2017年9月11日星期一
9
FORTRAN示例二:每次写入一个记录
每次写入一个数据
每次写入一个记录(平面)
2017年9月11日星期一
一个点 (IX,IY)
一个 记录
10
recl=:一次写入的数据量,与Fortran编辑单位有 关。
▪ 以字节数为单位:需要*4,recl= 144*73*4(字节) ▪ 以数据个数为单位,不需*4,recl= 144*73
让FORTRAN也能随机读写二进制文件任意字节数

让FORTRAN也能随机读写二进制文件任意字节数
王成良
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】1996(000)006
【摘要】本文提出了一种解决任何一种FORTRAN77语言随机读写二进制文件任意字节数的方法,并给出了该方法的源程序及调用实例。
【总页数】3页(P17-19)
【作者】王成良
【作者单位】无
【正文语种】中文
【中图分类】TP312FO
【相关文献】
1.高压气体淬火过程数值模拟软件中Fortran数据文件的处理--有限元和有限体积法软件二次开发中对Fortran二进制文件的处理 [J], 黄鹏;魏兴钊
2.利用VB随机文件处理中文记录与中文二进制文件的读取研究 [J], 王德超
3.任意随机序列关于二重非齐次马氏链的随机和的一类随机选择系统的随机逼近定理 [J], 王康康;李芳;杨卫国
4.FORTRAN语言上的任意精度运算 [J], 徐国良;李家楷
5.利用VB随机文件处理中文记录与中文二进制文件的读取研究 [J], 王德超
因版权原因,仅展示原文概要,查看原文内容请购买。
【Fortran】Fortran中Open,Read和Write的用法

【Fortran】Fortran中Open,Read和Write的⽤法1:write(*,*)"string";write(unit=*,FMT=*)"string";write(unit=6,FMT=*)"string"。
以上等价,6是默认输出位置,即屏幕。
2:print*,"string"。
Print只能对屏幕输出。
3:integer(kind=4) a !f90;integer*4 a !f77;integer(4) a !f77。
以上等价。
real(kind=4) a !f90;real*4 a !f77;real(4) a !f77。
以上等价。
4:f77,变量名长度1~6;f90,变量名长度1~31。
5:read(*,*)"string";write(unit=*,FMT=*)"string";write(unit=5,FMT=*)"string"。
以上等价,5是默认输⼊位置,即键盘。
6:FORMAT6.1 格式输出格式输出语句由两部分组成:输出语句和输出格式语句。
输出语句的⼀般形式为:WRITE(*,L) 输出表列或: PRINT L 输出表列其中:* 代表隐含的输出设备,L 指输出格式语句的标号。
输出格式语句的⼀般形式:L FORMAT(1X,S)其中:L 输出格式语句的标号,1X 纵向⾛纸符,S 输出格式,⽤不同的“格式编辑符”(简称“编辑符”)来实现指定的输出格式,各格式间⽤逗号相隔。
FORMAT语句⼜叫“格式语句”,是⼀个⾮执⾏语句,本⾝不产⽣任何操作,只是提供输⼊或输出的格式。
FORMAT语句可以出现在程序的任何地⽅(但必须在PROGRAM语句之后和END语句之前,如果在⼦程序中⽤FORMAT语句,则应在⼦程序定义语句之后)。
系统按WRITE语句或PRINT语句中指定的语句标号找到相应的FORMAT语句,并按FORMAT语句所规定的格式对数据进⾏输出。
二进制文件的读写以及相关心得

二进制文件读写分析有关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++中的二进制文件,可今天测试的时候突然发现程序生成的二进制文件和文本文件一样。
二进制读写文件

二进制读写文件在计算机中,所有的数据最终都以二进制形式存储,包括文本、图像、音频和视频等。
二进制文件的读写是计算机操作系统和应用程序中的常见操作之一,它涉及将数据从磁盘或其他存储介质加载到内存中,以便计算机可以对其进行处理。
二进制文件的读取通常包括以下几个步骤:打开文件、读取文件内容、关闭文件。
在打开文件时,计算机会根据文件路径找到文件的存储位置,并分配内存来存储文件的内容。
然后,计算机将按照一定的格式,读取文件中的二进制数据,并将其转换为计算机可以理解的数据类型,如字符、整数或浮点数等。
最后,计算机会关闭文件,释放内存。
类似地,二进制文件的写入也是一个相似的过程。
首先,计算机会创建一个新文件或打开一个已存在的文件,并分配内存用于存储数据。
然后,计算机将数据转换为二进制形式,并将其写入文件中。
最后,计算机会关闭文件,确保数据被正确地保存。
二进制文件的读写在计算机科学中具有重要的意义。
它可以用于存储和传输各种类型的数据,如文本文件、图像文件、音频文件和视频文件等。
通过使用二进制文件,计算机可以高效地处理大量的数据,并保持数据的完整性和准确性。
对于程序员来说,了解如何读写二进制文件是必不可少的技能之一。
在编写应用程序时,程序员经常需要读取和处理二进制文件,如配置文件、日志文件和数据库文件等。
通过对二进制文件的读写操作,程序员可以实现数据的持久化存储和交换,从而使程序更加灵活和可扩展。
二进制文件的读写还可以用于数据的备份和恢复。
通过将数据存储为二进制文件,可以有效地保存和恢复重要的数据,以防止数据丢失或损坏。
这在计算机系统的维护和管理中具有重要的作用。
二进制文件的读写是计算机科学中的重要概念和技能。
通过了解和掌握二进制文件的读写过程,我们可以更好地理解计算机系统的工作原理,并能够更有效地处理和管理数据。
无论是在编程还是在日常使用计算机时,对二进制文件的读写都是必不可少的技能。
希望本文能够帮助读者更好地理解和应用二进制文件的读写。
6 Fortran 程序设计6-文件

6 Fortran 程序设计6-文件1. 文件及其作用在Fortran程序设计中,文件是用于存储和读取数据的一种重要途径。
文件可以是文本文件或二进制文件,可以包含各种类型的数据,如数字、字符或其他格式的数据。
文件的作用主要有以下几个方面:1. 存储数据:文件可以将数据永久地保存在磁盘上,便于以后的使用。
2. 读取数据:文件可以从磁盘上读取数据,供程序使用。
3. 数据传输:文件可以用于将数据从一个程序传输到另一个程序。
2. 文件的创建和打开在Fortran中,可以使用open语句来创建和打开文件。
open语句的语法如下:fortranopen(unit=unit_number, , status=status, action=action, iostat=iostat)其中,unit_number表示文件的逻辑单元号,表示文件的名称,status表示文件的状态(可选参数,默认为'unknown'),action表示文件的操作(可选参数,默认为'read'),iostat表示打开文件的状态码(可选参数,默认为0)。
举个例子,要创建一个名为data.txt的文本文件,并将其打开,可以使用以下代码:fortranopen(unit=10, file='data.txt', status='unknown',action='read', iostat=iostat)3. 文件的读取和写入通过已经打开的文件,我们可以对其进行读取或写入操作。
Fortran中常用的文件读取和写入语句有:read语句:用于从文件中读取数据fortranread(unit=unit_number, format=format) variable1,variable2,其中,unit_number表示文件的逻辑单元号,format表示读取数据的格式,variable1、variable2等表示要读取到的变量。
文件操作(二进制读写)

⽂件操作(⼆进制读写)/***a.txt***/this is a wordhelloworld/***file.c***/#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){FILE *p = fopen("./a.txt","r");while(!feof(p)){char buf[100] = {0};fscanf(p,"%s",buf);printf("%s\n",buf);}fclose(p);return0;}fscanf()函数和scanf函数⽤法⼀样。
fscanf是从⼀个⽂件中读取字符串,scanf是从键盘读取字符串。
(遇到空格就停⽌)/***a.txt***/23 + 45 =35 + 63 =34 + 45 =/***file1.txt***/#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){int a,b;FILE *p = fopen("./a.txt","r");while(!feof(p)){char buf[100] = {0};//fgets(buf,"%s",p);//fscanf(p,"%s",buf);fscanf(p,"%d + %d = ",&a,&b);printf("a = %d , b = %d\n",a,b);//printf("%s\n",buf);}fclose(p);return0;}/***fprintf.c***/#include<stdio.h>#include<string.h>int main(){FILE *p = fopen("./b.txt","w");char buf[100] = "hello world";fprintf(p,"%s",buf);fclose(p);return0;}fread()函数和fwrite()函数:操作⽂本⽂件和⼆进制⽂件fopen()函数只能读⽂本⽂件/***fread.c***/#include<stdio.h>int main(){FILE *p = fopen("./a.txt","rb");char buf[100] = {0};fread(buf,sizeof(char),1,p); //第⼀个参数是缓冲区,第⼆个参数是读取字节⼤⼩,第三个 //参数表⽰读取字节个数,第四个参数表⽰⽂件指针 printf("buf = %s\n",buf);fclose(p);return0;}/***fread1.c***/#include<stdio.h>int main(){FILE *p = fopen("./a.txt","rb");while(!feof(p)){char buf[20] = {0};fread(buf,sizeof(char),sizeof(buf),p);printf("buf = %s\n",buf);}fclose(p);return0;}fread()函数有返回值,返回的是size_t类型,unsigned int ==》 %u/***fread.c***/#include<stdio.h>int main(){FILE *p = fopen("./c.txt","rb");char buf[1024] = {0};size_t res = fread(buf,sizeof(char),sizeof(buf),p);printf("res = %u\n",res);/*while(!feof(p)){char buf[20] = {0};fread(buf,sizeof(char),sizeof(buf),p);printf("buf = %s\n",buf);}*/fclose(p);return0;}/***c.txt***/asd运⾏结果:res = 4(⽂件结尾有⼀个换⾏字符‘\n’?);size_t res = fread(buf,sizeof(int),sizeof(buf),p);运⾏结果:res = 1;以上程序的运⾏结果和windos环境下读⽂本⽂件的结果会出现差异。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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维构成水平网格的二维数 组片的存放顺序如下:
这是GrADS缺省的数据存放次序,读取和调用数 据的效率最高。
2017年9月11日星期一
5
输出GrADS数据文件的次序
其中任何一(几)维都可省略。例:
▪ DATA ( 144, 73, 17, 6, 365 )
▪ DATA(144,73,17,365)
▪ DATA(144,73,17)
▪ DATA(6,365)
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
Var3
VarN
T1
……
一个 记录
Var1
Var2
Var3
VarN
T2
……
Var1
Var2
Var3
VarN
T3
……
2017年9月11日星期一
4
输出GrADS数据文件的次序
用循环写grads的二进制数据, 从内循环到外循环依次是:
▪ x (lon) → y (lat) → z (lev) → vars (不同变 量) → time
13
FORTRAN示例四:气压层不同
PS
ta
qa
zg
T1
……
一个 记录
PS
ta
qa
zg
T2
……
PS
ta
qa
zg
T3
……
2017年9月11日星期一
14
FORTRAN示例四:气压层不同
2017年9月11日星期一
15
FORTRAN示例五:多个变量
2017年9月11日星期一
16
Time 1, Level ? , Variable PS Time 1, Level 1000, Variable ta
▪ DATA(365)
在生成原始数据文件时,无论用工作站还是PC机, 无论是用FORTRAN语言还是用C 语言,所生成 的数据的格式都要求是无格式(unformatted)直 接(direct)记录格式,不允许在记录中加入描述 符,如记录开始、记录结束、换行符等。
2017年9月11日星期一
6
二进制Binary数据文件存储结构
zg 17 99 geopotential height (gpm)
ts 0 99 t2m temperature (degC)
P
0 99 precipitation (mm)
endvars
18
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)
Ps
P Ps
P Ps
P Ps
Time 365, Level ? , Variable P
2017/9/11
17
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
一个点 (IX,IY)
一个 记录
10
recl=:一次写入的数据量,与Fortran编辑单位有 关。
▪ 以字节数为单位:需要*4,recl= 144*73*4(字节) ▪ 以数据个数为单位,不需*4,recl= 144*73
recl与rec有关联 不同维数的循环嵌套顺序
(lon lat lev 不同变量 time ) (x y z 不同变量 t )
Var1
Var2
Var3
VarN
T1
……
Var1
Var2
Var3
VarN
T2
……
Var1
Var2
Var3
VarN
T3
……
2017年9月11日星期一
7
FORTRAN示例一:每次写入一个数据
无格式存储 直接存储
记录长度 记录序号
TIME循环 变量循环 LEV循环 LAT循环 LON循环
记录序号
2017年9月11日星期一
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日星期一
11
FORTRAN示例三:同时写入地表变量和气压层变量
PS
ta
va
zg
T1
……
一个 记录
PS
ta
va
zg
T2
……
PS
ta
va
zg
T3
……
2017年9月11日星期一
12
FORTRAN示例三: 同时写入地表变量和
气压层变量
2017年9月11日星期一
数据文件中的数据结构
一个记录
数
数据文件
时间1
每个 时间块
变量1
每个 变量块
层次1 (底)
每个 每个
层次 纬圈
纬圈1 (南)
西
据
时间2 变量2 层次2 纬圈2
文
…… …… …… ……
件
时间n
变量n
层次n (顶)
纬圈n (北)
东
2017年9月11日星期一
3
二进制Binary数据文件存储结构
Var1
Var2
如何写出ctl文件?
300 Time 1, Level 1000, Variable ua
t = 2, 3…365
then levels 925, 850, 700, 600, 500, 400,
300, 250, 200, 150, 100, 70, 50, 30, 20, 10
TTTTTiiiiimmmmmt3t3t3hhh000eeeeeeee000nnn11111,,, ,,,,,222lllLLLLLeee555vvveeeee000eeevvvvv,,, llleeeee222ssslllll000000999111,,,222??000111555000,,555,,,000VV000888,,,,,,aa555VVV111rr000aaaii000aa,,,rrr000iiibb777aaa,,000llbbbee77000lll00eee,,, ,,666TP55000Svwz00000ga,,a,,, 3355500000,,00022,,,00444,,000TTTTTTT11000iiiiiiimmmmmmm00… … … …,,, eeeeeee… … … …2323445… … … …,,,,,,, LLLLLLL… … … …eeeeeeevvvvvvv…………eeeeeeelllllll……………………??????? …………,,,,,,, VVVVVVVaaaaaaarrrrrrriiiiiiiaaaaaaabbbbbbbllllllleeeeeee