rogram readfromfile
implicit none
integer :: N, i
integer, dimension(130,2) :: cs
OPEN (UNIT=20,FILE='readtry.txt',STATUS='OLD',FORM='UNFORMATTED',)
do i=1,130
read (*,*) cs(i,1), cs(i,2)
enddo
do i=1,130
print *, cs(i,1), cs(i,2)
enddo
我是编程的初学者,我只想从一个有两列和大约130行的文件中读取数据。我曾试图写下这段代码,但它不起作用可以有人请求帮助吗?
出现以下错误
gfortran -Wall -c "Rwarray.f95" (in directory: D:\Fortrandir\2Darrays)
Rwarray.f95:7:67:
OPEN (UNIT=20,FILE='readtry.txt',STATUS='OLD',FORM='UNFORMATTED',)
1
Error: Syntax error in OPEN statement at (1)
Compilation failed.
答案 0 :(得分:1)
您有编译时错误,而不是读取问题。但这是它的要点:
它抱怨语法错误。你的陈述是这样的:
open(xxx, xxx, xxx, xxx,)
为了编译它,您需要删除最后一个逗号。但我不认为这会给你你想要的东西。
当您打开文件时,声明它是未格式化的。 Unformatted基本上意味着它包含某种形式的二进制值。更重要的是,未格式化的计算机之间无法保证可以正常工作。因此,除非使用FORM="UNFORMATTED"
参数通过Fortran程序在您的系统上编写此文件,否则我认为您不会得到您想要的内容。
我怀疑你的输入文件是这样的:
1 3
2 10
31 4711
那将是FORMATTED
,而不是UNFORMATTED
。
然后使用read(*, *)
。但是第一个*
指的是"标准输入",如果你想从文件中读取,你想使用read(20, *)
,因为20是你的单位打开输入文件。
对于write
语句,*
是正确的,假设您要写入"标准输出" - 即屏幕。
我还建议使用错误处理例程。将这两个变量添加到声明块中:
integer :: ios
character(len=100) :: iomsg
然后在打开,阅读或书写时使用它们:
open(unit=xx, file=xxx, status=xxx, action=xxx, form=xxx, io_stat=ios, iomsg=iomsg)
call check(ios, iomsg, "OPEN")
read(20, *, io_stat=ios, iomsg=iomsg) cs(1, i), cs(2, i)
call check(ios, iomsg, "READ")
您必须包含check
子例程,当然:
program readfromfile
implicit none
<declaraction block>
<execution block>
contains
subroutine check(ios, iomsg, action)
integer, intent(in) :: ios
character(len=*), intent(in) :: iomsg
character(len=*), intent(in), optional :: action
if (ios == 0) return ! No error occured, return
print*, "Error found. Error code:", ios
print*, "Message: ", trim(iomsg)
if (present(action)) print*, "Action was: ", trim(action)
stop 1
end subroutine check
end program readfromfile