Fortran - 基本输入输出

  • 简述

    到目前为止,我们已经看到我们可以使用键盘从键盘读取数据read *语句,并使用print*分别声明。这种形式的输入输出是free formatI/O,它被称为list-directed输入输出。
    自由格式的简单 I/O 具有以下形式 -
    
    read(*,*) item1, item2, item3...
    print *, item1, item2, item3
    write(*,*) item1, item2, item3...
    
    然而,格式化的 I/O 让您在数据传输方面更加灵活。
  • 格式化输入输出

    格式化的输入输出的语法如下 -
    
    read fmt, variable_list 
    print fmt, variable_list 
    write fmt, variable_list 
    
    在哪里,
    • fmt 是格式规范
    • variable-list 是要从键盘读取或写入屏幕的变量列表
    格式规范定义了格式化数据的显示方式。它由一个字符串组成,其中包含一个列表edit descriptors在括号内。
    一个edit descriptor指定显示字符和数字的确切格式,例如宽度、小数点后的位数等。

    例如

    
    Print "(f6.3)", pi
    
    下表描述了描述符 -
    描述符 描述 例子
    I
    这用于整数输出。它采用“rIw.m”的形式,其中 r、w 和 m 的含义在下表中给出。整数值在它们的域中是正确的。如果字段宽度不够大,无法容纳整数,则字段用星号填充。
    print "(3i5)", i, j, k
    F
    这用于实数输出。这采用“rFw.d”的形式,其中 r、w 和 d 的含义在下表中给出。真正的价值在他们的领域是正确的。如果字段宽度不足以容纳实数,则字段用星号填充。
    print "(f12.3)",pi
    E
    这用于以指数表示的实际输出。“E”描述符语句采用“rEw.d”形式,其中 r、w 和 d 的含义在下表中给出。真正的价值在他们的领域是正确的。如果字段宽度不足以容纳实数,则字段用星号填充。
    请注意,要打印一个小数点后三位的实数,至少需要十个字段宽度。一个用于尾数的符号,两个用于零,四个用于尾数,两个用于指数本身。一般来说,w ≥ d + 7。
    print "(e10.3)",123456.0 gives ‘0.123e+06’
    ES
    这用于实际输出(科学记数法)。它采用“rESw.d”的形式,其中 r、w 和 d 的含义在下表中给出。上面描述的“E”描述符与传统的众所周知的“科学记数法”略有不同。科学记数法的尾数在 1.0 到 10.0 的范围内,而 E 描述符的尾数在 0.1 到 1.0 的范围内。真正的价值在他们的领域是正确的。如果字段宽度不足以容纳实数,则字段用星号填充。这里同样,宽度域必须满足表达式 w ≥ d + 7
    print "(es10.3)",123456.0 gives ‘1.235e+05’
    A
    这用于字符输出。它采用“rAw”的形式,其中 r 和 w 的含义在下表中给出。字符类型在其领域中是正确的。如果字段宽度不足以容纳字符串,则字段将填充字符串的第一个“w”字符。
    print "(a10)", str
    X
    这用于空间输出。这采用“nX”形式,其中“n”是所需空格的数量。
    print "(5x, a10)", str
    /
    斜线描述符——用于插入空行。这采用“/”形式并强制下一个数据输出位于新行上。
    print "(/,5x, a10)", str
    以下符号与格式描述符一起使用 -
    序号 符号和说明
    1
    c
    列号
    2
    d
    实际输入或输出的小数点右边的位数
    3
    m
    要显示的最小位数
    4
    n
    要跳过的空格数
    5
    r
    重复计数——使用一个描述符或一组描述符的次数
    6
    w
    字段宽度 - 用于输入或输出的字符数

    示例 1

    
    program printPi
       pi = 3.141592653589793238 
       
       Print "(f6.3)", pi 
       Print "(f10.7)", pi
       Print "(f20.15)", pi 
       Print "(e16.4)", pi/100 
       
    end program printPi
    
    编译并执行上述代码时,会产生以下结果 -
    
    3.142
    3.1415927
    3.141592741012573
    0.3142E-01
    

    示例 2

    
    program printName
    implicit none
       character (len = 15) :: first_name
       print *,' Enter your first name.' 
       print *,' Up to 20 characters, please'
       
       read *,first_name 
       print "(1x,a)",first_name
       
    end program printName
    
    上面的代码编译执行后,会产生如下结果:(假设用户输入姓名Alex)
    
    Enter your first name.
    Up to 20 characters, please
    Alex 
    

    示例 3

    
    program formattedPrint
    implicit none
       real :: c = 1.2786456e-9, d = 0.1234567e3 
       integer :: n = 300789, k = 45, i = 2
       character (len=15) :: str="JC2182"
       
       print "(i6)", k 
       print "(i6.3)", k 
       print "(3i10)", n, k, i 
       print "(i10,i3,i5)", n, k, i 
       print "(a15)",str 
       print "(f12.3)", d
       print "(e12.4)", c 
       print '(/,3x,"n = ",i6, 3x, "d = ",f7.4)', n, d
       
    end program formattedPrint
    
    编译并执行上述代码时,会产生以下结果 -
    
    45
    045
    300789 45  2
    300789 45  2
    JC2182
    123.457
    0.1279E-08
    n = 300789 d = *******
    
  • 格式声明

    格式语句允许您在一个语句中混合和匹配字符、整数和实数输出。以下示例演示了这一点 -
    
    program productDetails 
    implicit none 
       character (len = 15) :: name
       integer :: id 
       real :: weight
       name = 'Ardupilot'
       id = 1
       weight = 0.08
       
       print *,' The product details are' 
       
       print 100
       100 format (7x,'Name:', 7x, 'Id:', 1x, 'Weight:')
       
       print 200, name, id, weight 
       200 format(1x, a, 2x, i3, 2x, f5.2) 
       
    end program productDetails
    
    编译并执行上述代码时,会产生以下结果 -
    
    The product details are
    Name:       Id:    Weight:
    Ardupilot   1       0.08