在数组中写入字符和数字

时间:2012-07-27 21:25:55

标签: fortran

我有一个Fortran代码,它读取带有单独字符和数字行的txt文件,然后将它们写入包含20个元素的一维数组中。 此代码与Fortran 77编译器Force 2.0.9不兼容。我的问题是我们如何使用Fortran 77编译器应用aformenetioned过程;即定义一维数组nd然后逐行将txt文件写入数组的元素?

提前谢谢。

txt文件如下:

案例1:

10  0  1  2  0

1.104  1.008  0.6   5.0

25  125.0  175.0  0.7  1000.0

0.60

1  5

高级案例

15 53 0 10 0 1 0 0 1 0 0 0 0

0 0 0 0

0 0 1500.0 0 0 .03

0 0.001 0

0.1 0 0.125 0.08 0.46

0.1 5.0 0.04

@Jason: 我是初学者,还在学习Fortran。我猜Force 2使用g77。 以下是原始代码的对应部分。 Force 2编辑器返回一个空的txt文件。

       DIMENSION CARD(20)
       CHARACTER*64 FILENAME
       DATA XHEND / 4HEND  /

       OPEN(UNIT=3,FILE='CON')
       OPEN(UNIT=4,FILE='CON')
       OPEN(UNIT=7,STATUS='SCRATCH')

       WRITE(3,9000) 'PLEASE ENTER THE INPUT FILE NAME : '
  9000 FORMAT (A)
       READ(4,9000) FILENAME

       OPEN(UNIT=5,FILE=FILENAME,STATUS='OLD')
       WRITE(3,9000) 'PLEASE ENTER THE OUTPUT FILE NAME : '
       READ(4,9000) FILENAME
       OPEN(UNIT=6,FILE=FILENAME,STATUS='NEW')
       FILENAME = '...'

       IR = 7
       IW = 6
       IP = 15
  5    REWIND IR
       I = 0
  2    READ (5,7204,END=10000) CARD
       IF (I .EQ. 0 ) WRITE (IW,7000)
  7000 FORMAT (1H1 / 10X,15HINPUT DECK ECHO / 10X,15(1H-))
       I= I + 1
       WRITE (IW,9204)  I,CARD
       IF (CARD(1) .EQ. XHEND ) GO TO 7020
       WRITE (IR,7204) CARD
  7204 FORMAT (20A4)
  9204 FORMAT (1X,I4,2X,20A4)
       GO TO 2
  7020 REWIND IR         

1 个答案:

答案 0 :(得分:4)

看起来CARD被用作保存20个4个字符的字符串。我不认为声明是一个字符变量,只是作为一个数组,所以也许在极旧的FORTRAN样式中,一个非字符变量被用来保存字符?您使用的是20A4格式,因此值必须精确定位在20个4个字符的组中。您必须添加空格,以便将它们对齐成4列的组。

如果你想读取数字,那么将它们读成数字类型并使用列表导向的IO会容易得多:

real values (20)
read (5, *) values

然后您不必担心文件中值的精确定位。

这真是古老的FORTRAN ......甚至是FORTRAN-77之前的风格。我不记得上次看到Hollerith(H)格式了!你是从哪里学到的?

编辑:虽然我喜欢Fortran进行许多编程任务,但我不会使用FORTRAN 66!计算机应该让事情变得更容易......没有理由不得不计算字符。而不是

7000 FORMAT (1H1 / 10X,15HINPUT DECK ECHO / 10X,15(1H-))

您可以使用

7000 FORMAT ( / 10X, "INPUT DECK ECHO" / 10X, 15("-") )

我只能想到使用Hollerith代码的两个理由:不要费心去改变遗留源代码(当前的Fortran编译器可以处理30年前过时的功能!值得注意的是!Fortran源代码永远不会死!) ,或研究计算语言的历史。这个名字是为了纪念一位伟大的计算机先驱,其发明在一年内完成了1890年的美国人口普查,当时的1880年人口普查历时八年:http://en.wikipedia.org/wiki/Herman_Hollerith

我很怀疑你今天会在第一栏中看到“1”进行“运输控制”。我不得不查看“1”是页面弹出的代码。您更有可能在输出中看到它。见Are Fortran control characters (carriage control) still implemented in compilers?