Fortran - 基本输入输出

到目前为止,我们已经看到,我们可以使用 read * 语句从键盘读取数据,并使用 print* 语句将输出显示到屏幕上。 这种形式的输入输出是自由格式 I/O,称为列表定向输入输出。

自由格式简单 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是格式规范

  • 变量列表是要从键盘读取或在屏幕上写入的变量列表

格式规范定义了格式化数据的显示方式。 它由一个字符串组成,其中包含括号中的编辑描述符列表。

编辑描述符指定显示字符和数字的确切格式,例如宽度、小数点后的数字等。

例如

Print "(f6.3)", pi

下表描述了描述符 −

Descriptor 描述 示例
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 的含义如下表所示。 真正的值在他们的领域是正确的。 如果字段宽度不足以容纳实数,则该字段将填充星号。

请注意,要打印具有三位小数的实数,需要至少 10 的字段宽度。 一个用于尾数符号,两个用于零,四个用于尾数,两个用于指数本身。 一般来说, 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

以下符号与格式描述符一起使用 −

Sr.No 符号 & 描述
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

当上面的代码被编译并执行时,会产生以下结果:(假设用户输入名称Zara)

Enter your first name.
Up to 20 characters, please
Zara 

示例 3

program formattedPrint
implicit none

   real :: c = 1.2786456e-9, d = 0.1234567e3 
   integer :: n = 300789, k = 45, i = 2
   character (len=15) :: str="Tutorials Point"
   
   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
Tutorials Point
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