我是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