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

为什么在Fortran中使用命令打印会覆盖输入文件?,fortran,gfortran,Fortran,Gfortran,我正在编写代码,并使用Fortran中的输入和输出功能。代码如下所示(仅用于简化): 我使用的是Gfortran 5.3,结果与我预期的不一样。当程序运行时,我希望在屏幕(或Ubuntu操作系统中的终端)上获得变量T的结果,变量I和A(I)被写入文件output.dat。我对变量I和A(I)没有问题,因为它们已成功写入文件output.dat。问题在于变量T,它没有出现在终端上,但被写入了文件input.dat。即使是fileinput.dat中的前一个文件也没有被覆盖。谁能给我提个建议吗 仅供

我正在编写代码,并使用Fortran中的输入和输出功能。代码如下所示(仅用于简化):

我使用的是Gfortran 5.3,结果与我预期的不一样。当程序运行时,我希望在屏幕(或Ubuntu操作系统中的终端)上获得变量
T
的结果,变量
I
A(I)
被写入文件
output.dat
。我对变量
I
A(I)
没有问题,因为它们已成功写入文件
output.dat
。问题在于变量
T
,它没有出现在终端上,但被写入了文件
input.dat
。即使是file
input.dat
中的前一个文件也没有被覆盖。谁能给我提个建议吗

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

  • Microsoft Fortran Powerstation(非常老的一个):但它的工作方式与我预期的一样
  • MinGW-w64(Windows的GCC版本):但它不能正常工作

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

    OPEN语句将该单元定向到输入文件。因此,打印隐式寻址该单元的语句,然后将其输出指向同一文件

    使用不同的单元号-对于编译器预连接的单元,选择大于10的值通常是安全的。为了进一步安全,您可以使用
    查询(UNIT=UNIT\u number,EXIST=some\u logical\u variable)
    语句在打开语句之前检查特定单元是否已连接到文件,如果是,请选择其他单元号。理想情况下,如果您正在编写Fortran 2008,则可以使用NEWUNIT说明符


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

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

    OPEN语句将该单元定向到输入文件。因此,打印隐式寻址该单元的语句,然后将其输出指向同一文件

    使用不同的单元号-对于编译器预连接的单元,选择大于10的值通常是安全的。为了进一步安全,您可以使用
    查询(UNIT=UNIT\u number,EXIST=some\u logical\u variable)
    语句在打开语句之前检查特定单元是否已连接到文件,如果是,请选择其他单元号。理想情况下,如果您正在编写Fortran 2008,则可以使用NEWUNIT说明符


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

    我找到了答案。实际上,我上面发布的代码在Gfortran 5.3上运行得很好,因为我使用了
    OPEN(UNIT=1,…)
    OPEN(UNIT=2,…)
    ,这是因为我使用
    1
    2
    不会有问题的。我只是写了这个简单的例子来表示我真正的代码,而没有先检查它。但实际上,在我的实际代码中,我使用了两条语句,它们分别是
    OPEN(UNIT=5,…)
    OPEN(UNIT=6,…)
    ,这在Fortran中是不允许的,因为:

  • UNIT=5
    在中声明了用于从键盘读入数据的
    标准
  • UNIT=6
    声明
    标准输出
    ,用于将常规输出打印到屏幕上
  • UNIT=0
    声明
    标准错误
    ,用于将错误消息打印到屏幕上

  • 我以前没有意识到,因为我正在处理相当旧的代码,所以我需要将其重写为新版本。因此,为了避免出现问题,请不要使用
    UNIT=5
    UNIT=6
    UNIT=0

    我找到了答案。实际上,我上面发布的代码在Gfortran 5.3上运行得很好,因为我使用了
    OPEN(UNIT=1,…)
    OPEN(UNIT=2,…)
    ,这是因为我使用
    1
    2
    不会有问题的。我只是写了这个简单的例子来表示我真正的代码,而没有先检查它。但实际上,在我的实际代码中,我使用了两条语句,它们分别是
    OPEN(UNIT=5,…)
    OPEN(UNIT=6,…)
    ,这在Fortran中是不允许的,因为:

  • UNIT=5
    中声明了用于从键盘读入数据的
    标准
  • UNIT=6
    声明
    标准输出
    ,用于将常规输出打印到屏幕上
  • UNIT=0
    声明
    标准错误
    ,用于将错误消息打印到屏幕上

  • 我以前没有意识到,因为我正在处理相当旧的代码,所以我需要将其重写为新版本。因此,为了避免出现问题,请不要使用
    UNIT=5
    UNIT=6
    UNIT=0

    嗯,Linux上的GCC 5.3按预期工作。@AlexanderVogt:你也在Gfortran 5.3上试过了吗?你和我得到同样的结果了吗?我认为我上面写的代码没有错,不是吗?代码对我来说很好。乍一看,我看不出有什么问题。虽然我个人不会自己选择单位(提示:
    newunit=
    ),尤其是10以下的数字。这可能会干扰STDIN/STDERR/STDOUT。@AlexanderVogt:对不起,我没有收到你的消息。对于“代码对我来说很好”,你的意思是你也在使用Gfortran,但代码运行良好,还是你在使用gcc?
    GfortranPROGRAM 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