首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Fortran中读取可能很长的文本文件

如何在Fortran中读取可能很长的文本文件
EN

Stack Overflow用户
提问于 2016-01-12 14:35:52
回答 2查看 2K关注 0票数 3

假设我有一个文本文件,可能有很长的文本行,例如

代码语言:javascript
复制
short
short
reeeeeeeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaally loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooonnnnggg
short as well
short

我可以编写一个简单的程序来读取这个文件:

代码语言:javascript
复制
program main
implicit none
integer, parameter        :: BIG_NUMBER = 400
integer                   :: lun
character(len=BIG_NUMBER) :: line
integer                   :: istat

open(newunit = lun, file = 'myfile')

do
   read (lun, '(A)', iostat = istat) line
   if (istat /= 0) exit
end do

end program main

这只支持文本文件,其中所有行都不超过400个字符。在C语言中,使用指针,类似的程序将自动支持任何文本文件。

如何重写示例程序,使其能够读取所有长度的行?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-12 19:35:29

可以使用不前进的输入将行的连续块读取到缓冲区中,然后将每个块合并在一起,在延迟长度字符变量中形成完整的行。例如:

代码语言:javascript
复制
subroutine get_line(lun, line, iostat, iomsg)
  integer, intent(in)           :: lun
  character(len=:), intent(out), allocatable :: line
  integer, intent(out)          :: iostat
  character(*), intent(inout)   :: iomsg

  integer, parameter            :: buffer_len = 80
  character(len=buffer_len)     :: buffer
  integer                       :: size_read

  line = ''
  do
    read ( lun, '(A)',  &
        iostat = iostat,  &
        iomsg = iomsg,  &
        advance = 'no',  &
        size = size_read ) buffer
    if (is_iostat_eor(iostat)) then
      line = line // buffer(:size_read)
      iostat = 0
      exit
    else if (iostat == 0) then
      line = line // buffer
    else
      exit
    end if
  end do
end subroutine get_line
票数 7
EN

Stack Overflow用户

发布于 2016-01-12 15:26:15

当你手头有一个解决方案时,千万不要寻求另一个解决方案,除非它有一些限制。因为您可以在C中完成它,并且使用C和Fortran之间的所有互操作性,所以我建议您用C编写一小部分程序来处理读取。C部分可以简单得像一个由2个函数组成的集合和很少的全局变量:

  1. 一个函数,用于查询实际读取下一行并将其大小返回给fortran的下一行的大小,以及EOF标志。
  2. 一个函数,用于获取将行数据返回给fortran的下一行数据。

例如,如果使用getline,全局变量将是File对象、行缓冲区和缓冲区大小。此外,还可以添加两个由fortran调用的函数来打开和关闭文件,或者在查询函数中处理所有这些。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34746461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档