为什么在Fortran中使用命令打印会覆盖输入文件?
我正在编写代码,并使用Fortran中的输入和输出功能。代码如下所示(仅用于简化): 我使用的是Gfortran 5.3,结果与我预期的不一样。当程序运行时,我希望在屏幕(或Ubuntu操作系统中的终端)上获得变量为什么在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中的前一个文件也没有被覆盖。谁能给我提个建议吗 仅供
T
的结果,变量I
和A(I)
被写入文件output.dat
。我对变量I
和A(I)
没有问题,因为它们已成功写入文件output.dat
。问题在于变量T
,它没有出现在终端上,但被写入了文件input.dat
。即使是fileinput.dat
中的前一个文件也没有被覆盖。谁能给我提个建议吗
仅供参考,我还尝试了其他编译器(使用Windows操作系统),例如:
这可能是因为在平台/编译器/编译器版本/编译器选项的特定组合中,单元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