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=*
    。您的输入文件应易于自动读取
  • 这就是我从快速浏览中所能看到的。看看这是否有帮助。

    A两件事:

  • 您没有在文件中执行
    倒带操作。首先,您读取整个文件以获得行数,但如果不进行倒带,则从末尾开始读取,这意味着没有任何内容被实际读取到数组中
  • 使用显式格式读取
    是危险的。您必须确保输入文件与格式完全匹配。在您的情况下,我希望按照@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
    ....