为什么在Fortran中使用命令PRINT会覆盖输入文件?

bes*_*ong 0 fortran gfortran

我正在编写我的代码并在Fortran中使用输入和输出功能.代码看起来像这样(仅用于简化):

PROGRAM TEST

  REAL, DIMENSION(1000):: A
  REAL:: B
  INTEGER::T

 !Defining input and output  
  OPEN(UNIT=1, FILE='input.dat', STATUS='OLD')
  OPEN(UNIT=2, FILE='output.dat', STATUS='NEW')  

 !Reading from file "input.dat"  
  READ(1,*) (A(I),I=1,1000)

 !Just for initial condition
  B=0.0  

  DO T=1, 10
    PRINT *, 'Step =', T 
        DO I=1, 1000     
           B=B+1.0     
           A(I)=A(I)/B  
        END DO
  END DO

 !Writing results into file "output.dat"
   DO I=1, 1000
      WRITE (2,100) I, A(I)
   END DO 
   100 FORMAT (' ',T3, I12, T17, F14.4)   

END PROGRAM TEST
Run Code Online (Sandbox Code Playgroud)

我正在使用Gfortran 5.3,结果不像我期待的那样.我有望获得变量的结果T的画面(或终端在Ubuntu OS)上时该程序正在运行,并且变量IA(I)被写入到文件中output.dat.我没有与变量的问题IA(I),因为他们成功地写入文件output.dat.问题在于变量T,它没有出现在终端上,而是写入文件中input.dat.好吧,即使文件中的上一个文件input.dat也没有被覆盖.有人能给我这个建议吗?

仅供参考,我也试过其他编译器(使用Windows操作系统),例如:

  1. 微软Fortran Powerstation(非常古老的):但它的工作方式和我预期的一样.
  2. MinGW-w64(适用于Windows的GCC版本):但它无法正常工作.

Ian*_*anH 5

这可能是因为您使用平台/编译器/编译器版本/编译器选项的特定组合,单元1是控制台的预连接单元.

您的OPEN语句将该单元指向您的输入文件.因此,隐式地处理该单元的PRINT语句然后将它们的输出定向到同一文件.

使用不同的单元号 - 从编译器预连接的单元中选择大于10的值通常是安全的.为了进一步安全,您可以使用INQUIRE(UNIT=unit_number, EXIST=some_logical_variable)语句检查特定单元是否连接到OPEN语句之前的文件 - 如果是,则选择不同的单元号.理想情况下,如果您正在编写Fortran 2008,则可以使用NEWUNIT说明符.

(不要将单元号的值硬编码到输入/输出语句中 - 它们应始终由变量或命名常量表示,以便可以在一个地方轻松设置/更改值.)