File 在Fortran中,如何读取数据文件中的一小段(值)行?
我有以下问题: 数据文件中有“n”行,但这不是问题,因为我能够读取我感兴趣的特定行。但是,我应该只读取并保存这行的一个片段(一个值)。 例如,该行在文件中写入为:File 在Fortran中,如何读取数据文件中的一小段(值)行?,file,fortran,save,fragment,line,File,Fortran,Save,Fragment,Line,我有以下问题: 数据文件中有“n”行,但这不是问题,因为我能够读取我感兴趣的特定行。但是,我应该只读取并保存这行的一个片段(一个值)。 例如,该行在文件中写入为: 阻力矩=2779.94 kN-m 然后,我必须阅读并保存2779.94。也许,我可以这样做,从“=”一直读到行尾,然后,我应该删除最后5个字符。但是,我不知道这是否可能或如何做到这一点。有人知道吗 数值的字符数可能会改变(例如,阻力矩=27790.945 kN-m)。因此,我无法锁定一个点以完成读取,我只能锁定不会发生更改的起点(在值
阻力矩=2779.94 kN-m
然后,我必须阅读并保存2779.94
。也许,我可以这样做,从“=”一直读到行尾,然后,我应该删除最后5个字符。但是,我不知道这是否可能或如何做到这一点。有人知道吗
数值的字符数可能会改变(例如,
阻力矩=27790.945 kN-m
)。因此,我无法锁定一个点以完成读取,我只能锁定不会发生更改的起点(在值之前)。为了支持您的格式,可能需要使用Fortran编辑描述符
这还不够,您需要编写一个专门用于
你的案子。如果一个典型的文件输入是
resisting moment = 12312.9 kN-m
force = 777.4 N
一种可能的读取程序是:
subroutine split_string(instring, string1, string2, delimiter)
character(*), intent(inout) :: instring
character(*), intent(in) :: delimiter
character(*), intent(out):: string1, string2
integer :: ind
instring = trim(instring)
ind = scan(instring, delimiter)
string1 = instring(1:ind-1)
string2 = instring(ind+1:)
end subroutine split_string
real function parsed_read(file_unit)
integer, intent(in) :: file_unit
character(128) :: str, str1, str2, str3, str4
read(file_unit,'(A)') str
str = trim(adjustl(str))
call split_string(str, str1, str2, "=")
str2 = trim(adjustl(str2))
call split_string(str2, str3, str4, " ")
str3 = trim(adjustl(str3))
read(str3,'(F20.8)') parsed_read
endfunction parsed_read
program for
real :: resisting_moment, force
! Read line by line and parse according to parsed_read function
open(unit=1,file='inp.dat')
resisting_moment = parsed_read(1)
force = parsed_read(1)
close(1)
print*,'resisting_moment: ',resisting_moment
print*,'force: ',force
endprogram for
函数parsed_read按“=”然后按“”拆分行
并从结果字符串读取中提取实际值
从字符串本身(在Fortran中称为内部文件
在这方面)。该功能需要进行调整,以适应
您的特定格式
另一种方法是使用Fortran名称列表。
Fortran名称列表允许轻松管理
参数的输入/输出(例如)
已经实现了许多有用的功能。
将变量定义为属于名称列表后
您可以使用单个读取指令读取它们(或其中的一个子集)。
如果您的输入文件使用名称列表格式,例如
&mynamelist
resisting_moment = 12312.9, ! kN-m
force = 777.4 ! N
/
一个简单的程序读取它就可以了
program for
real :: resisting_moment, force
namelist /mynamelist/resisting_moment, force
! Read namelist
open(unit=1,file='inp_nl.dat')
read(1, mynamelist)
close(1)
print*,'resisting_moment: ',resisting_moment
print*,'force: ',force
endprogram for
为了支持您的格式,可能需要使用Fortran编辑描述符 这还不够,您需要编写一个专门用于 你的案子。如果一个典型的文件输入是
resisting moment = 12312.9 kN-m
force = 777.4 N
一种可能的读取程序是:
subroutine split_string(instring, string1, string2, delimiter)
character(*), intent(inout) :: instring
character(*), intent(in) :: delimiter
character(*), intent(out):: string1, string2
integer :: ind
instring = trim(instring)
ind = scan(instring, delimiter)
string1 = instring(1:ind-1)
string2 = instring(ind+1:)
end subroutine split_string
real function parsed_read(file_unit)
integer, intent(in) :: file_unit
character(128) :: str, str1, str2, str3, str4
read(file_unit,'(A)') str
str = trim(adjustl(str))
call split_string(str, str1, str2, "=")
str2 = trim(adjustl(str2))
call split_string(str2, str3, str4, " ")
str3 = trim(adjustl(str3))
read(str3,'(F20.8)') parsed_read
endfunction parsed_read
program for
real :: resisting_moment, force
! Read line by line and parse according to parsed_read function
open(unit=1,file='inp.dat')
resisting_moment = parsed_read(1)
force = parsed_read(1)
close(1)
print*,'resisting_moment: ',resisting_moment
print*,'force: ',force
endprogram for
函数parsed_read按“=”然后按“”拆分行
并从结果字符串读取中提取实际值
从字符串本身(在Fortran中称为内部文件
在这方面)。该功能需要进行调整,以适应
您的特定格式
另一种方法是使用Fortran名称列表。
Fortran名称列表允许轻松管理
参数的输入/输出(例如)
已经实现了许多有用的功能。
将变量定义为属于名称列表后
您可以使用单个读取指令读取它们(或其中的一个子集)。
如果您的输入文件使用名称列表格式,例如
&mynamelist
resisting_moment = 12312.9, ! kN-m
force = 777.4 ! N
/
一个简单的程序读取它就可以了
program for
real :: resisting_moment, force
namelist /mynamelist/resisting_moment, force
! Read namelist
open(unit=1,file='inp_nl.dat')
read(1, mynamelist)
close(1)
print*,'resisting_moment: ',resisting_moment
print*,'force: ',force
endprogram for
注意不要试图读到比线上更多的“单词”,例如force(来自@franz示例),你应该这样做
read(unit,*)words(:4)
注意不要试图读到比线上更多的“单词”,例如force(来自@franz示例),你应该这样做
read(unit,*)words(:4)
另外,在@agentp和@Franz解决方案之间
subroutine readrhs( line, val )
implicit none
character(*), intent(in) :: line
real, intent(out) :: val
integer :: n
n = index( line, '=' )
read( line( n+1 : ), * ) val
end
program main
implicit none
character(100) :: line
real :: val
line = "resisting moment = 12312.9 kN-m"
call readrhs( line, val )
print *, "moment = ", val
line = "force = 777.4 N"
call readrhs( line, val )
print *, "force = ", val
end
另外,在@agentp和@Franz解决方案之间
subroutine readrhs( line, val )
implicit none
character(*), intent(in) :: line
real, intent(out) :: val
integer :: n
n = index( line, '=' )
read( line( n+1 : ), * ) val
end
program main
implicit none
character(100) :: line
real :: val
line = "resisting moment = 12312.9 kN-m"
call readrhs( line, val )
print *, "moment = ", val
line = "force = 777.4 N"
call readrhs( line, val )
print *, "force = ", val
end
到目前为止你得到了什么?我(我怀疑其他人)不愿意从第1步开始教你Fortran,但我很乐意帮助你完成这件事。到目前为止,你得到了什么?我(我怀疑其他人)不愿意从第1广场教你Fortran,但很乐意帮助你完成这件事。