Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用stdin从FORTRAN66中的文件读取记录添加额外的不需要的垃圾_Fortran - Fatal编程技术网

使用stdin从FORTRAN66中的文件读取记录添加额外的不需要的垃圾

使用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

我正在尝试使用FORTRAN 66读取以下指定格式的文件

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年历史了。