fortran文件读取技巧
6 Fortran 程序设计6-文件

6 Fortran 程序设计6-文件在Fortran程序设计中,文件操作是非常重要的一部分。
通过文件操作,可以实现数据的读取和写入,以及数据的存储和处理。
本文主要介绍Fortran程序设计中与文件相关的操作。
文件的打开和关闭在Fortran中,可以使用OPEN语句打开一个文件,并使用CLOSE语句关闭文件。
以下是打开文件和关闭文件的示例代码:fortranOPEN(unit=10, file='data.txt', status='old',action='read')! 打开名为data.txt的文件,使用编号为10的单元,以只读方式读取文件内容! 进行读取操作CLOSE(unit=10)! 关闭编号为10的文件单元OPEN语句中的unit参数是文件的编号,file参数是文件的路径和名称,status参数指定文件的打开模式,action参数指定文件的操作方式。
常用的status参数值包括:'old'(读取现有文件)、'new'(创建新文件)、'replace'(替换现有文件)等。
文件的读取和写入在Fortran中,可以使用READ语句从文件中读取数据,使用WRITE语句将数据写入文件。
以下是读取文件和写入文件的示例代码:fortranREAD(unit=10, fmt=) variable1, variable2,! 从编号为10的文件单元中读取数据,并将数据存储到相应的变量中! 进行处理操作WRITE(unit=20, fmt=) variable1, variable2,! 将变量的值写入编号为20的文件单元中READ语句中的unit参数是文件的编号,fmt参数是数据的格式。
通常使用表示自由格式,即根据数据的类型自动判断格式。
WRITE语句的unit参数和fmt参数的含义与READ语句相同。
文件的定位在处理大型文件时,有时候需要跳过一部分数据或者回到文件的开头位置。
fortran中read

fortran中readFortran是一种广泛使用的编程语言,尤其在科学计算和工程领域得到广泛应用。
在Fortran中,读取输入数据通常使用read语句实现。
在本文中,我们将探讨Fortran中read语句的用法,以及一些相关的注意事项。
首先,我们需要了解read语句的语法。
在Fortran中,read语句的语法如下:read(*,*)其中"*"表示通配符,代表任何数据类型。
第一个星号表示读取输入数据的格式,第二个星号表示读取输入数据的来源。
因此,如果我们想要从标准输入读取一个整数,我们可以使用以下代码:program read_exampleimplicit noneinteger :: nread(*,*) nwrite(*,*) nend program read_example在这个示例程序中,read语句的第一个星号表示我们希望读取一个整数,而第二个星号表示我们希望从标准输入读取数据。
读取的数据将存储在变量n中,最后我们使用write语句将结果输出到标准输出。
除了通配符外,我们还可以使用Fortran中定义的数据类型来读取特定的数据。
例如,如果我们想要读取一个字符串,我们可以使用以下代码:program read_string_exampleimplicit nonecharacter(len=10) :: sread(*,*) swrite(*,*) send program read_string_example在这个示例程序中,我们定义了一个长度为10的字符型变量s,然后使用read语句读取输入的字符串,并使用write语句输出结果。
除了基本数据类型外,read语句还可以用于读取数组和格式化的输入数据。
例如,如果我们想要读取一个5x5的矩阵,我们可以使用以下代码:program read_matrix_exampleimplicit noneinteger :: i, jinteger, dimension(5,5) :: matrixdo i = 1, 5read(*,*) matrix(i,:)end dodo i = 1, 5do j = 1, 5write(*,'(I3)') matrix(i,j)end dowrite(*,*)end doend program read_matrix_example在这个示例程序中,我们先定义了一个5x5的整型数组matrix,然后使用do循环和read语句逐行读取输入的数据。
6 Fortran 程序设计6-文件

6 Fortran 程序设计6-文件6 Fortran 程序设计 6 文件在 Fortran 程序设计中,文件的处理是一个重要且实用的部分。
文件可以帮助我们存储和读取大量的数据,使得程序能够处理复杂和大规模的信息。
首先,让我们来理解一下什么是文件。
简单来说,文件就是在计算机存储设备上存储的数据集合。
在 Fortran 中,文件可以是文本文件,也可以是二进制文件。
文本文件中的数据是以人类可读的字符形式存储的,比如数字、字母和符号。
二进制文件则是以计算机内部的二进制形式存储数据,通常更节省空间并且读取和写入速度更快,但对于人类来说不太直观。
那么,如何在 Fortran 中打开和关闭文件呢?这就需要用到一些特定的语句。
我们使用 OPEN 语句来打开一个文件,并指定一些相关的参数,比如文件的名称、访问模式(读、写、读写等)、文件的格式等。
而当我们完成对文件的操作后,使用 CLOSE 语句来关闭文件,以释放相关的资源并确保数据的正确保存。
接下来,谈谈文件的读取操作。
对于文本文件,我们可以使用READ 语句逐行或者按照特定的格式读取数据。
在读取数据时,需要注意数据的类型和格式与我们程序中的变量相匹配,否则可能会导致读取错误。
而对于二进制文件的读取,通常需要使用专门的二进制读取函数,并要准确地了解文件中数据的存储结构。
写入文件也是常见的操作。
同样,对于文本文件,可以使用WRITE 语句将数据以文本形式写入。
在写入时,可以控制数据的格式和输出的位置。
二进制文件的写入则需要使用相应的二进制写入函数,并且要确保数据的正确转换和存储。
在处理文件时,还需要注意一些错误情况。
比如,文件可能不存在、无法打开、读写权限不足等。
Fortran 提供了一些机制来检测和处理这些错误,通过检查相关的状态变量或者使用特定的错误处理语句,我们可以让程序在遇到问题时能够做出适当的反应,而不是直接崩溃。
另外,文件的访问模式也有多种选择。
只读模式(READONLY)允许我们只能从文件中读取数据;只写模式(WRITEONLY)则只能向文件中写入数据;读写模式(READWRITE)则既可以读也可以写。
如何用Fortran批量读取文件

复杂的方法可以是:自己写个子程序,进行自己需要的转换。(略
1. 如何加大Stack size?
选Project => Settings => Link => Category: Output =>
Stack allocations
Reserve: 这里填新值(默认为1M,若需要10M,则填10000000)
open(12,file=FILENAME(L))
read(12,*) .......
enddo
法2
do i=1,number of files
file_name=ቤተ መጻሕፍቲ ባይዱhar(i+48)//'.dat'
file_number=i+100
open(fileid=file_number,file=file_name)
write(form,*) "(",num,"f10.3)"
write(*,form) data
stop
end
4. 如何用F90/95生成随机数?
注意:
现在计算机产生的随机数都是伪随机数。
random_number(x) 产生一个0到1之间的随机数(x可以是向量),但是每次总是那几个数。
read(fileid=file_number,*) vars
close(fileid)
enddo
需要读取大批量的数据,文件有一定的规律,特别是按照数字的顺序排列的,现给出读取文件名的方法:
简单方法:
Character*40 fname
integer m
fortran获取文件行数和列数的程序 -回复

fortran获取文件行数和列数的程序-回复Fortran获取文件行数和列数的程序是一个非常有用的工具,特别是在处理大量数据文件时。
该程序可以帮助我们快速准确地确定文件的维度,从而更好地进行数据分析和处理。
接下来,我们将逐步解释如何编写此程序,并解释其实现的原理和作用。
步骤1:打开文件首先,我们需要使用Fortran的文件处理函数打开待处理的文件。
使用内建的OPEN函数,我们可以指定文件的路径和访问模式。
例如,我们可以使用以下代码打开一个名为“data.txt”的文本文件:open(1, file='data.txt', status='old', action='read')这里,'1'是文件句柄,file参数指定了文件的路径和名称,而status 参数定义了访问模式为“old”,action参数指定以只读模式打开文件。
步骤2:获取文件行数要获取文件的行数,我们需要逐行读取文件内容,并计算累积的行数。
为了实现这一点,我们可以使用一个计数器变量,并在每次读取新行时将其增加1。
以下是一个简单的代码示例:integer :: numRows = 0character(len=500) :: linedo while (.true.)read(1, *, iostat=ios) lineif (ios /= 0) exitnumRows = numRows + 1end do在这个示例中,我们使用一个无限循环来读取文件的每一行。
read函数用于读取下一行的内容,并通过iostat参数返回读取状态。
如果读取状态不等于0(即不是成功读取),则退出循环。
否则,行数计数器将增加1。
步骤3:获取文件列数要获取文件的列数,我们需要解析文件的每一行,并计算每行包含的字段数量。
为了实现这一点,我们可以使用字符串处理函数和循环进行字段计数。
以下是一个简单的代码示例:integer :: numCols = 0integer :: i, startPosdo i = 1, len(line)if (line(i:i) == ' ') thenstartPos = i + 1do while (line(startPos:startPos) == ' ')startPos = startPos + 1end doif (startPos <= len(line)) numCols = numCols + 1 end ifend donumCols = numCols + 1在这个示例中,我们首先初始化列数计数器为0。
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应该就是采样间隔。
fortran文件读取技巧

最近专业课海洋要素计算作业需要用fortran编程读取验潮站资料(如下,是txt,其中数据是有62行,限于篇幅,我只截取了前5行数据外加验潮站的4行头信息)!要注意的是最后一列数据后面没有空格program ex1!**********************************************!* written by 潘海东, 2015,3,20!*一次性读取744个数据,放入一维数组中!*(如果一次性读取太多的话可能会对系统造成某些影响)!**********************************************INTEGER :: b(62*12),icharacter(len=20) time,location,u1,u2open(10, file = 'C:\Users\Administrator\Desktop\sjs_t_97aug_m(harmonic).txt', status = 'old')!********读取头信息read(10,"(A3)") u1read(10,"(A18)") timeread(10,"(A13)") locationread(10,"(A2)") u2!********读取数据read(10,100) b(:)100 format(61(11(I4,1x),I4,/),11(I4,1x),I4) !在fortran的输入输出中'/'代表换行close(10)endprogram ex2!**********************************************!* written by 潘海东, 2015,3,20!*读取第3列至第11列!**********************************************INTEGER :: a(62,9),icharacter(len=20) time,location,u1,u2open(10, file = 'C:\Users\Administrator\Desktop\sjs_t_97aug_m(harmonic).txt', status = 'old')!***读取头信息read(10,"(A3)") u1read(10,"(A18)") timeread(10,"(A13)") locationread(10,"(A2)") u2!***读取验潮站数据do i=1,62read(10,100) a(i,:)write(*,99) a(i,:)end do99 format(9(I4,1x))100 format(10x,9(I4,1x),4x)close(10)end!!!!这些技巧总结起来就是利用nX跳过不想要的东西。
fortran读文件教学课件

openif: If(status == 0) then
! open was OK. Read values
readloop: do
read(3, *, iostat = status) value
if(status /= 0) Exit
nvals = nvals + 1
write(*, 20) nvals, value
開啟檔案
開啟檔案的設定參數
設定參數說明
a) unit = int_expr
開啟一個檔案時要給定這個檔案一個讀取的編號,以後使用 write, read時使用這個編號就可以對這個檔案來讀寫了 int_expr = 數字 → 最好避開1, 2, 5, 6
2, 6是指內定的輸出位置,也就是螢幕 1, 5則是指內定的輸入位置,也就是鍵盤
8-1 The open statement
範例
a) opening a file for input
<error open (unit = 8, file = ‘a.dat', status = 'OLD', action = 'read', iostat = ierror)
8-1 The open statement
設定參數說明
f) access = char_expr
‘sequential’, ‘direct’設定讀取檔案的方式 char_expr = ‘sequential’ →讀取檔案的動作會以“循序”的方
法 來做讀取
‘direct’ →讀取檔案的動作可以任意指定位置
20 format(1x, 'Line', I6, ': Value = ', F10.4)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最近专业课海洋要素计算作业需要用fortran编程读取验潮站资料(如下,是txt,其中数据是有62行,限于篇幅,我只截取了前5行数据外加验潮站的4行头信息)
!要注意的是最后一列数据后面没有空格
program ex1
!**********************************************
!* written by 潘海东, 2015,3,20
!*一次性读取744个数据,放入一维数组中
!*(如果一次性读取太多的话可能会对系统造成某些影响)
!**********************************************
INTEGER :: b(62*12),i
character(len=20) time,location,u1,u2
open(10, file = 'C:\Users\Administrator\Desktop\sjs_t_97aug_m(harmonic).txt', status = 'old')
!********读取头信息
read(10,"(A3)") u1
read(10,"(A18)") time
read(10,"(A13)") location
read(10,"(A2)") u2
!********读取数据
read(10,100) b(:)
100 format(61(11(I4,1x),I4,/),11(I4,1x),I4) !在fortran的输入输出中'/'代表换行
close(10)
end
program ex2
!**********************************************
!* written by 潘海东, 2015,3,20
!*读取第3列至第11列
!**********************************************
INTEGER :: a(62,9),i
character(len=20) time,location,u1,u2
open(10, file = 'C:\Users\Administrator\Desktop\sjs_t_97aug_m(harmonic).txt', status = 'old')
!***读取头信息
read(10,"(A3)") u1
read(10,"(A18)") time
read(10,"(A13)") location
read(10,"(A2)") u2
!***读取验潮站数据
do i=1,62
read(10,100) a(i,:)
write(*,99) a(i,:)
end do
99 format(9(I4,1x))
100 format(10x,9(I4,1x),4x)
close(10)
end
!!!!这些技巧总结起来就是利用nX跳过不想要的东西。