Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 在Fortran中,如何读取数据文件中的一小段(值)行?_File_Fortran_Save_Fragment_Line - Fatal编程技术网

File 在Fortran中,如何读取数据文件中的一小段(值)行?

File 在Fortran中,如何读取数据文件中的一小段(值)行?,file,fortran,save,fragment,line,File,Fortran,Save,Fragment,Line,我有以下问题: 数据文件中有“n”行,但这不是问题,因为我能够读取我感兴趣的特定行。但是,我应该只读取并保存这行的一个片段(一个值)。 例如,该行在文件中写入为: 阻力矩=2779.94 kN-m 然后,我必须阅读并保存2779.94。也许,我可以这样做,从“=”一直读到行尾,然后,我应该删除最后5个字符。但是,我不知道这是否可能或如何做到这一点。有人知道吗 数值的字符数可能会改变(例如,阻力矩=27790.945 kN-m)。因此,我无法锁定一个点以完成读取,我只能锁定不会发生更改的起点(在值

我有以下问题: 数据文件中有“n”行,但这不是问题,因为我能够读取我感兴趣的特定行。但是,我应该只读取并保存这行的一个片段(一个值)。 例如,该行在文件中写入为:
阻力矩=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,但很乐意帮助你完成这件事。