使用stdin从FORTRAN66中的文件读取记录添加额外的不需要的垃圾
我正在尝试使用FORTRAN 66读取以下指定格式的文件使用stdin从FORTRAN66中的文件读取记录添加额外的不需要的垃圾,fortran,Fortran,我正在尝试使用FORTRAN 66读取以下指定格式的文件 1000 MS 1 - Join Grps Group Project 5 5 Four Programs Programming 15 9 Quiz 1 Quizzes 10 7 FORTRAN
1000
MS 1 - Join Grps Group Project 5 5
Four Programs Programming 15 9
Quiz 1 Quizzes 10 7
FORTRAN Programming 25 18
Quiz 2 Quizzes 10 9
HW 1 - Looplang Homework 20 15
我像这样执行和读取文件:
program < grades.txt
程序
第一行是一个班级可以获得的总分数
剩下的几行是课堂上的作业
每行的格式如下:作业名称(20个字符)类别(20个字符)可能的分数(14个字符)赢得的分数(14个字符)
出于某种原因,当代码运行并读取文件时,从第一条赋值记录开始,我得到错误5006,并且找不到错误代码的解释。调试时程序的输出如下所示:
$ file < grades.txt
MS 1 - Join Grps Group Project 5 6417876
NOT EOF
EOF 5006
NAME CATEGORY POSSIBLE EARNED
$file
我的目标是能够阅读每一行并将每一列放入其相应的数组中,然后稍后引用这些数组来打印每个类别的报告,其中包含每个作业、可能的分数、收入以及类别的总百分比,然后循环等等。
我不明白输出中的“6417876”是从哪里来的,它肯定不是程序读取时通过管道传输到stdin的文件的一部分。
程序代码如下所示:
CHARACTER*20 ASSIGNMENTT(100)
CHARACTER*20 CATEGORY(100)
INTEGER POSSIBLE(100)
INTEGER EARNED(100)
INTEGER TOTALPTS
INTEGER REASON
INTEGER I, N
READ(5,50)TOTALPTS
50 FORMAT(I4)
c Read the arrays in
I=1
100 READ(5,110,IOSTAT=REASON)ASSIGNMENTT(I),CATEGORY(I),POSSIBLE(I),EARNED(I)
110 FORMAT(2A20x,2I14x)
WRITE(*,110)ASSIGNMENTT(I),CATEGORY(I),POSSIBLE(I),EARNED(I)
I=I+1
IF (REASON < 0) GOTO 120
WRITE(*,*)"NOT EOF"
IF (I<100 .AND. REASON == 0) GOTO 100
WRITE(*,*)"EOF", REASON
c Get the number of items (For some reason stdin adds an extra item that's not in the file, so I subtract 2 instead of 1
120 N=I-2
c Display the Names and Ages
WRITE(*,200)
200 FORMAT("NAME",T20,"CATEGORY",T40,"POSSIBLE",T54,"EARNED",T68)
DO 300 I=1,N
210 FORMAT(A20,A20,I14,I14)
300 WRITE(*,210)ASSIGNMENTT(I),CATEGORY(I),POSSIBLE(I),EARNED(I)
END
字符*20赋值t(100)
字符*20类别(100)
可能的整数(100)
整数(100)
整型TOTALPTS
整数原因
整数I,N
读取(5,50)个总PTS
50格式(I4)
c读取中的数组
I=1
100读取(5110,IOSTAT=原因)分配(I)、类别(I)、可能(I)、赢得(I)
110格式(2A20x、2I14x)
填写(*,110)转让T(I)、类别(I)、可能(I)、已赚(I)
I=I+1
如果(原因<0)转到120
写入(*,*)“非EOF”
如果(I读取文件内容的行太长,因此我缩短了变量名称以节省一些空间,问题就解决了。Wow.FORTRAN 66 vintage。您的问题可能是空格和/或缺少空格。这是我假设的,但我已经计算了尾随空格的数量,每个字段加起来就是正确的总数。)字符数(包括空格)以上程序不是Fortran 66。快速可视化grep至少会将其设置为Fortran 90(比较运算符、变量名长度,可能还有其他).Character也是Fortran 77。有趣的发现,感谢最终原因是标签为100的行太长,在我的编辑器中打开文件很快就会发现,因此被截断。将其拆分为两行-修复该问题(以及非标准格式110)我认为这个程序正在运行。我会让其他人找出为什么这是修复,可能与一些未声明的变量或其他有关,我真的不觉得有动机调试像这样的古老代码。请不要为此缩短名称。查找延续行。最好学习不到半个世纪的Fortran-不需要新代码我现在用的是Fortran 2003之前的任何语言。我一直找不到一种方法可以不让编译器失败。这是一个类的赋值,所以我真的没有选择我使用什么版本的Fortran。接下来我必须用COBOL语言编写同样的程序。这是一个非常糟糕的问题答案,我希望没有人遵循这一点方法。这可能是我唯一一次使用该语言,所以我至少要告诉你的老师,Fortran编程语言已经有5次重大修改。他/她正在教授的版本已经有40年历史了。