在文件中追加列



我是Fortran的新手,对Fortran中的读/写append(?)有疑问:

我有 2 个文件:文件1.dat (ASCII) 包含 4 列:

1  10  1   5
2  20  5   8
3  30  76  8
...

文件2.dat ( ASCII) 包含 2 列:

22   18
18   1
3    7
8    74
... 

现在我想创建一个新文件,并将文件 2 的列附加到文件 1 列的右侧(注意行数可以不同)

文件3.dat (ASCII)

1  10  1   5   22   18
2  20  5   8   18   1
3  30  76  8   3    7
               8    74
...

我尝试使用 OPEN READ 和 WRITE 命令来执行此操作,该命令适用于 1 个文件,但是当我尝试同时使用 2 个文件进行读取时,它不起作用。

Fortran 中是否有将列附加到文件的命令?


问题是我的 2 个文件肯定会有不同的行数。当我运行循环(在我的示例中)3 次时,一切正常,当我更频繁地运行循环时,我收到错误:

list in: end of file
apparent state: unit 15 named File1.dat
last Format: list io
lately reading direct formatted external 10

这是我的代码:

program addColumn
implicit none
real*4 a,b,c,d,e,f
integer*2  i
open (20, file='File3.dat', status='replace')
do i = 1, 3
  open(15, file='File1.dat')
  open(16, file='File2.dat')
  read(15, *) a,b,c,d
  read(16, *) e,f
  write (20,*) "row", i,":   ", a , b ,c ,d ,e ,f
  print *,     "row", i,":   ", a , b ,c ,d ,e ,f
end do
close(15)
close(16)
close(20)
end

没有任何限制可以阻止同时读取多个文件。可能,您必须注意文件描述符 - 对于您将要使用的所有文件,它们应该不同。考虑以下示例,它从两个文本文件读取并同时写入第三个文本文件。

program append_columns
    use, intrinsic :: iso_fortran_env, only: iostat_end
    implicit none
    character(len=256) string1, string2
    character(len=16) format
    integer unit1, unit2, unit3
    integer status1, status2
    integer index, length
    open(newunit = unit1, file = 'column_file_1.txt', status = 'old', action = 'read')
    open(newunit = unit2, file = 'column_file_2.txt', status = 'old', action = 'read')
    open(newunit = unit3, file = 'column_file_result.txt', status = 'replace', action = 'write')
    do
        read(unit1, '(a)', iostat = status1) string1
        read(unit2, '(a)', iostat = status2) string2
        if ((status1 == iostat_end) .and. (status2 == iostat_end)) then
            exit
        end if
        if ((status1 > 0) .or. (status2 > 0)) then
            error stop 'Could not read a file.'
        end if
        !... some lines removed 
        write(unit3, format) trim(string1), trim(string2)
        !... some lines removed 
    end do
    close(unit1)
    close(unit2)
    close(unit3)
end

相关内容

  • 没有找到相关文章

最新更新