file-io - 如何在 Fortran 中读取可能包含很长行的文本文件

标签 file-io fortran

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

short
short
reeeeeeeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaally loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooonnnnggg
short as well
short

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

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 中,使用指针,类似的程序会自动支持任何文本文件。

如何重写示例程序以使其可以读取所有长度的行?

最佳答案

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

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

关于file-io - 如何在 Fortran 中读取可能包含很长行的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34746461/

相关文章:

c++ - 用于在 Windows 7 上输出的 fstream

c++ - 在 C++ 绑定(bind)中捕获 Fortran 运行时错误和信号

fortran - 使用lapack的dgemm(链接器错误)

fortran - OpenMP 和 Fortran 中不共享的共享变量

arrays - 访问 Fortran 字符串中特定索引处的字符

linux - 使用 gfortran 在 makefile 中进行库链接

c - fclose 返回值检查

循环中的 C++ SIGSEGV 段错误

通过C函数创建并返回文件

exception - 在 D 中打开一个文件