【问题标题】:Compare data from 3 dat files比较来自 3 个 dat 文件的数据
【发布时间】:2016-06-29 17:41:32
【问题描述】:

我正在尝试在 Fortran 90 中编写一个代码,该代码从 3 个不同的文件(称为“data1.dat”、“data2.dat”、“data3.dat”)中读取数据。所有文件由 3 列组成,并且N行(这些行依赖于另一个代码),然后进行如下操作:

C(i)=(data1(i)-data2(i))/(data2(i)-data3(i))

i代表每个文件第二列的数据"i"时。

我知道如何读取文件,但我不知道如何操作每个文件中的数据。

有什么想法吗?

【问题讨论】:

    标签: fortran gfortran read-data


    【解决方案1】:

    我会指望你完成所有变量声明并打开所有文件。

    我手头没有编译器,所以请在使用之前验证我的语法。希望以下内容介于工作代码和伪代码之间:

    OPEN (400, file='XXXX.YYY', status='UNKNOWN')
    
    DO i = 1, NMAX
        READ(100, *) data1
        READ(200, *) data2
        READ(300, *) data3
    
        denom = data2 - data3
    
        IF (denom .EQ. 0.) STOP "Cannot Divide by zero"
    
        CCC = (data1-data2)/denom
        WRITE (400, *) CCC
    ENDDO
    

    每次只通过每个文件中的一行被读取到内存中;依次计算 CCC 并将其写入输出文件。在下一次迭代中,程序将读取下面的行,而不是从顶部开始。不需要数组。

    最后记得关闭你的文件。您可以在任何您认为合适的地方使用 IO 格式。

    希望这会有所帮助。

    【讨论】:

    • status='UNKNOWN' 的目的是什么,为什么不replace 或什么都没有?
    • 如果你使用REPLACE,但它不存在,可能会出错。如果您使用NEW 并且确实如此,则肯定有错误。 UNKNOWN 更丑陋,但对于短 sn-p 更灵活。
    • 从上下文来看,我认为您将data1 等作为数组,使denom 成为数组。这意味着人们应该小心if(denom.eq.0) - 也许if(any(denom.eq.0))?还是您的意思是仅引用第一列? [我觉得这个问题很难理解。]
    • @chw21 replace 并且文件不存在,应该不会有错误(文件刚刚创建)。我认为 Vladimir F 关于“什么都没有”的观点是,如果省略说明符,unknown 是默认值。
    • 谢谢,也许这应该可行,但我还有另一个问题,我必须知道数据中文件“NMAX”的数量。有一种简单的方法可以做到这一点吗?或者最容易检查数据文件中的文件数。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多