Io 如何为I/0语句定义输入行?
我想从名为Io 如何为I/0语句定义输入行?,io,fortran,Io,Fortran,我想从名为Input.txt的文件中读取一些值。输入文件如下所示: 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 .... 共36条1、2、3、4s线 然后,我使用以下代码读取文件
Input.txt
的文件中读取一些值。输入文件如下所示:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
....
共36条1、2、3、4s线
然后,我使用以下代码读取文件:
program outputtest
implicit none
double precision, allocatable, dimension(:) :: A,B,C,D
integer :: counter,ii, ierror
ierror=0
counter=1
open(39, action='read', name='input.txt', status='old')
do
read(39,100, IOSTAT=Ierror)
100 Format(T8,I1)
If (Ierror>0) then
print *, 'error when reading'
stop
end if
If (ierror<0) then
print*, 'end of file reached'
exit
end if
counter=counter+1
end do
If (.not.allocated(A)) ALLocate(A(counter))
If (.not.allocated(b)) ALLocate(b(counter))
If (.not.allocated(c)) ALLocate(c(counter))
If (.not.allocated(d)) ALLocate(d(counter))
do ii=1, counter-1
read(39,110, IOSTAT=ierror) A(ii), B(ii), C(ii), D(ii)
110 Format(T8, I4, T16, I4, T24, I4, T32, I4)
If (ierror.neqv.0) exit
end do
close(39)
write (*,120) A
write (*,120) B
write (*,120) C
write (*,120) D
120 Format('result:', 1x,I2)
end program outputtest
这意味着我既没有读到正确的行,也没有读到另一个错误。我在vim中使用了选项标尺来查看这些条目所在的行,并将这些行与T一起使用。我使用tabs创建了文件Input.txt
。我的错误是什么?有两件事:
倒带操作。首先,您读取整个文件以获得行数,但如果不进行倒带,则从末尾开始读取,这意味着没有任何内容被实际读取到数组中
使用显式格式读取
是危险的。您必须确保输入文件与格式完全匹配。在您的情况下,我希望按照@high performance mark的建议使用fmt=*
。您的输入文件应易于自动读取倒带操作。首先,您读取整个文件以获得行数,但如果不进行倒带,则从末尾开始读取,这意味着没有任何内容被实际读取到数组中
使用显式格式读取
是危险的。您必须确保输入文件与格式完全匹配。在您的情况下,我希望按照@high performance mark的建议使用fmt=*
。您的输入文件应易于自动读取这就是我从快速浏览中所能看到的。看看这是否有帮助。对于一个简单的结构良好的输入文件,如您向我们展示的,我会完全放弃format语句,只使用列表定向输入,类似于
read(39,fmt=*,IOSTAT=ierror)a(ii),B(ii),C(ii),d(ii)
。读取时的精确格式很脆弱,而且完全可能是您的i4
元素与输入文件中的一系列空格对齐,而不是跨越数字。我回滚了OP最近的编辑。它实质上改变了问题,使下面的答案变得无关紧要。它还指出,显示的输入文件并不能很好地表示OP实际拥有的输入文件。我建议OP问一个新问题。谢谢!通过让我问一个新问题,我也找到了我的新问题的答案:)对于一个简单的结构良好的输入文件,如您向我们展示的,我会完全放弃format语句,只使用列表定向输入,类似于read(39,fmt=*,IOSTAT=ierror)a(ii),B(ii),C(ii),d(ii)
。读取时的精确格式很脆弱,而且完全可能是您的i4
元素与输入文件中的一系列空格对齐,而不是跨越数字。我回滚了OP最近的编辑。它实质上改变了问题,使下面的答案变得无关紧要。它还指出,显示的输入文件并不能很好地表示OP实际拥有的输入文件。我建议OP问一个新问题。谢谢!通过让我问一个新问题,我也找到了新问题的答案:)还有一个简单的教训:如果使用iostat=
则应注意返回的值。好的,如果您重新建议不使用格式化阅读,如果您只想阅读其中一列,您会使用什么,也就是说,只有包含2的列取决于我对输入文件格式的确定程度。我越不确定,我就越倾向于阅读所有的价值观,而忽略那些我不想要的。现在,如果文件是由Fortran程序编写的,并且我知道程序FORMAT
语句,那么我真的会使用它。@ian你是对的,我已经把我的意思说得更清楚了。简单的教训是:如果使用iostat=
的话,应该注意返回的值。好的,如果您建议不使用格式化读取,如果您只想读取其中一列,即仅包含2的列,您将使用什么?取决于我对输入文件格式的确定程度。我越不确定,我就越倾向于阅读所有的价值观,而忽略那些我不想要的。现在,如果文件是由Fortran程序编写的,并且我知道程序FORMAT
语句,那么我真的会使用它。@IanH你是对的,我已经把我的意思说得更清楚了。
result: 0
result: 0
result: 0
....