假设我有一个文本文件,可能有很长的文本行,例如
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语言中,使用指针,类似的程序将自动支持任何文本文件。
如何重写示例程序,使其能够读取所有长度的行?
发布于 2016-01-12 19:35:29
可以使用不前进的输入将行的连续块读取到缓冲区中,然后将每个块合并在一起,在延迟长度字符变量中形成完整的行。例如:
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发布于 2016-01-12 15:26:15
当你手头有一个解决方案时,千万不要寻求另一个解决方案,除非它有一些限制。因为您可以在C中完成它,并且使用C和Fortran之间的所有互操作性,所以我建议您用C编写一小部分程序来处理读取。C部分可以简单得像一个由2个函数组成的集合和很少的全局变量:
例如,如果使用getline,全局变量将是File对象、行缓冲区和缓冲区大小。此外,还可以添加两个由fortran调用的函数来打开和关闭文件,或者在查询函数中处理所有这些。
https://stackoverflow.com/questions/34746461
复制相似问题