代码之家  ›  专栏  ›  技术社区  ›  Huzo

打印到标准输出使用f95[复制]写入打开的文件

  •  1
  • Huzo  · 技术社区  · 6 年前

    我正在编写代码,并在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
    

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

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

    1. Microsoft Fortran Powerstation(非常旧的一个):但它的工作方式和我预期的一样。
    0 回复  |  直到 9 年前
        1
  •  5
  •   IanH    9 年前

    这可能是因为对于平台/编译器/编译器版本/编译器选项的特定组合,Unit1是控制台的预连接单元。

    使用不同的单元号-选择大于10的值通常对编译器预连接的单元是安全的。为了安全起见,您可以使用 INQUIRE(UNIT=unit_number, EXIST=some_logical_variable) 语句检查特定单元是否连接到打开语句之前的文件,如果是,请选择其他单元号。理想情况下,如果您正在编写fortran2008,您可以使用NEWUNIT说明符。

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

        2
  •  1
  •   bestrong    9 年前

    OPEN(UNIT=1,...) OPEN(UNIT=2,...) 1 2 OPEN(UNIT=5,...) OPEN(UNIT=6,...)

    1. UNIT=5 声明 Standard In 用于从键盘读取数据。
    2. UNIT=6 声明 Standard Out
    3. UNIT=0 声明 Standard Error 用于将错误消息打印到屏幕上。

    我以前没有意识到,因为我正在处理非常旧的代码,所以我需要将它重写为一个新的版本。所以,为了避免这些问题,就不要使用 单位=5 单位=6 .