【问题标题】:Reading multiple files in Fortran 95在 Fortran 95 中读取多个文件
【发布时间】:2011-03-06 20:59:01
【问题描述】:

我正在用 Fortran 95 编写代码,以读取一些看起来像 1.dat、2.dat、......、9999.dat 的文件。我有一个代码,显示为 0001.dat、0002.dat、............ 9999.dat。好像

character*12, fn
..
DO i=1,n
    write(fn,*)i
    open(1,file=fn)
    do j=1,5
       read(1,*)x(i,j),y(i,j),z(i,j)
        end do
 10  format(i4.4,'.dat')

您能否建议我如何才能阅读我拥有的文件?谢谢.u

【问题讨论】:

    标签: fortran fortran95


    【解决方案1】:

    如果您将格式更改为

    10    format (i4,'.dat')
    

    我试过这个

          character *8 filename
    
          do i=1,9999
            write (filename, 10) i  
            write (*,*) filename
          end do
    
    10    format (i4,'.dat')
    
          end
    

    而且我的文件名中没有前导零。

    这顶帽子是你要找的吗?

    更新
    我明白了……

    那么格式应该是

    10    format (i0,'.dat')
    

    “0”表示左对齐。

    我使用以下 pgm 对其进行了测试

        character*12, fn
    
        integer x(11,5)
        integer y(11,5)
        integer z(11,5)
    
        do i=1,11
            write(fn,10)i
            open(1,file=fn)
            do j=1,5
                read(1,*)x(i,j),y(i,j),z(i,j)
            end do
            close(1)
        end do
    
    10  format(i0,'.dat')
    
        end
    

    这对我有用。

    更新 2

        implicit none
    
        integer n,ns,i,j
    
        real x(9999,400),y(9999,400),z(9999,400),a(9999,400),aa(400)
    
        character*12, fn
    
            n =  14
        ns = 2  
    
        do i = 0,n
            do j = 1, 5
                    a(i,j) = 0.0
                end do
        end do
    
        do i=1,n               
            write(fn,10)i
            open(1,file=fn)
    
            do j=1,5
                    read(1,*)x(i,j),y(i,j),z(i,j)
                    if(i.le.ns) then
                         a(i,j) = x(i,j)
                else
                     a(i,j) = x(i,j) + a(i-ns,j)
                    end if
                aa(j) = a(i,j)
                write(*,*) j,x(i,j),y(i,j),z(i,j),a(i,j)
            end do
            close(1)
    
            do j = 1, 5
                write(*,*) aa(j)
            end do
        end do
    
    10  format(i0,'.dat')       
    
        end
    

    为我工作。

    输出(在 Ubuntu 10.10 上)。

    ./a.out
               1   1.0000000       3.0000000       5.0000000       1.0000000    
               2   2.0000000       5.0000000       7.0000000       2.0000000    
               3   3.0000000       7.0000000       8.0000000       3.0000000    
               4   1.0000000       4.0000000       8.0000000       1.0000000    
               5   1.0000000       4.0000000       8.0000000       1.0000000    
       1.0000000    
       2.0000000    
       3.0000000    
       1.0000000    
       1.0000000    
               1   3.0000000       8.0000000       5.0000000       3.0000000    
               2   7.0000000       5.0000000       7.0000000       7.0000000    
               3   3.0000000       7.0000000       8.0000000       3.0000000    
               4   1.0000000       4.0000000       10.000000       1.0000000    
               5   3.0000000       5.0000000       7.0000000       3.0000000    
       3.0000000    
       7.0000000    
       3.0000000    
       1.0000000    
       3.0000000    
               1   3.0000000       8.0000000       5.0000000       4.0000000    
               2   7.0000000       5.0000000       7.0000000       9.0000000    
               3   3.0000000       7.0000000       8.0000000       6.0000000    
               4   1.0000000       4.0000000       10.000000       2.0000000    
               5   3.0000000       5.0000000       7.0000000       4.0000000    
       4.0000000    
       9.0000000    
       6.0000000    
       2.0000000    
       4.0000000    
               1   3.0000000       8.0000000       5.0000000       6.0000000    
               2   7.0000000       5.0000000       7.0000000       14.000000    
               3   3.0000000       7.0000000       8.0000000       6.0000000    
               4   1.0000000       4.0000000       10.000000       2.0000000    
               5   3.0000000       5.0000000       7.0000000       6.0000000    
       6.0000000    
       14.000000    
       6.0000000    
       2.0000000    
       6.0000000    
               1   3.0000000       8.0000000       5.0000000       7.0000000    
               2   7.0000000       5.0000000       7.0000000       16.000000    
               3   3.0000000       7.0000000       8.0000000       9.0000000    
               4   1.0000000       4.0000000       10.000000       3.0000000    
               5   3.0000000       5.0000000       7.0000000       7.0000000    
       7.0000000    
       16.000000    
       9.0000000    
       3.0000000    
       7.0000000    
               1   3.0000000       8.0000000       5.0000000       9.0000000    
               2   7.0000000       5.0000000       7.0000000       21.000000    
               3   3.0000000       7.0000000       8.0000000       9.0000000    
               4   1.0000000       4.0000000       10.000000       3.0000000    
               5   3.0000000       5.0000000       7.0000000       9.0000000    
       9.0000000    
       21.000000    
       9.0000000    
       3.0000000    
       9.0000000    
               1   3.0000000       8.0000000       5.0000000       10.000000    
               2   7.0000000       5.0000000       7.0000000       23.000000    
               3   3.0000000       7.0000000       8.0000000       12.000000    
               4   1.0000000       4.0000000       10.000000       4.0000000    
               5   3.0000000       5.0000000       7.0000000       10.000000    
       10.000000    
       23.000000    
       12.000000    
       4.0000000    
       10.000000    
               1   3.0000000       8.0000000       5.0000000       12.000000    
               2   7.0000000       5.0000000       7.0000000       28.000000    
               3   3.0000000       7.0000000       8.0000000       12.000000    
               4   1.0000000       4.0000000       10.000000       4.0000000    
               5   3.0000000       5.0000000       7.0000000       12.000000    
       12.000000    
       28.000000    
       12.000000    
       4.0000000    
       12.000000    
               1   3.0000000       8.0000000       5.0000000       13.000000    
               2   7.0000000       5.0000000       7.0000000       30.000000    
               3   3.0000000       7.0000000       8.0000000       15.000000    
               4   1.0000000       4.0000000       10.000000       5.0000000    
               5   3.0000000       5.0000000       7.0000000       13.000000    
       13.000000    
       30.000000    
       15.000000    
       5.0000000    
       13.000000    
               1   3.0000000       8.0000000       5.0000000       15.000000    
               2   7.0000000       5.0000000       7.0000000       35.000000    
               3   3.0000000       7.0000000       8.0000000       15.000000    
               4   1.0000000       4.0000000       10.000000       5.0000000    
               5   3.0000000       5.0000000       7.0000000       15.000000    
       15.000000    
       35.000000    
       15.000000    
       5.0000000    
       15.000000    
               1   3.0000000       8.0000000       5.0000000       16.000000    
               2   7.0000000       5.0000000       7.0000000       37.000000    
               3   3.0000000       7.0000000       8.0000000       18.000000    
               4   1.0000000       4.0000000       10.000000       6.0000000    
               5   3.0000000       5.0000000       7.0000000       16.000000    
       16.000000    
       37.000000    
       18.000000    
       6.0000000    
       16.000000    
    At line 23 of file c.for (unit = 1, file = '12.dat')
    Fortran runtime error: End of file
    

    【讨论】:

    • 谢谢阿兰。但是我遇到了同样的错误,例如:列表中:文件结束明显状态:单元 1 命名为 1.dat 最后格式:列表 io 最近读取顺序格式化的外部 IO 已中止您如何看待这个问题?
    • 您能否通过这些文件的样本更新问题,以便我们为您提供一个简单的阅读程序?
    • 当然。实际上我在 Linux [Ubuntu] 中工作,我自己编写了数据文件。我不确定如何向您提供我的数据文件。但它包括 3 列和 9 行。而已。如果我将文件重命名为 0001.dat、0002.dat 而不是 1.dat、2.dat,则程序可以读取。
    • 很奇怪。你没有忘记关闭文件吧?我在你的循环中看不到 close(1)。
    • 抱歉,这里一切正常。文件 1.dat 只有 4 行。我添加了一个来让它运行。但可以肯定的是,pgm 从 1.dat 到 11.dat 运行良好(我复制了 2.dat 几次直到 11.dat)。更新 2 列出了 pgm 和输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2021-12-08
    • 2023-03-27
    相关资源
    最近更新 更多