Fortran运行时报Bad integer for item 1 in list input错误如何解决?
错误原因
- 触发报错的直接原因是读取首个数值的
do为无限死循环,无退出条件。程序读完第一个整数60000后,会继续读取文件后续内容尝试赋值给整型变量firstnumber,若后续内容为浮点数,就会直接触发「输入项1不是合法整数」的运行时错误。 - 除此之外代码还存在多处逻辑错误:读取首行数值后未将后续60000个数值读入
arrayone数组,数组全程为空导致后续统计结果无效;遍历循环内反复打开同一文件、使用动态变化的单位号,既冗余也容易触发IO资源冲突;标准差计算公式完全不符合数学定义,计算结果无意义。
修复后的完整代码
implicit none integer :: i, firstnumber real*4 :: average, sum_, standarddeviation, variance real*4, allocatable :: arrayone(:) ! 使用10以上的固定单位号,避免和系统预留单位冲突 open(unit=10, file="C:\cygwin64\data sets for labs and assignments\Numbers.txt", status="old") ! 单次读取首个数值即可,不需要循环 read(10, *) firstnumber allocate(arrayone(firstnumber)) ! 一次性读取后续所有数值存入数组 read(10, *) arrayone close(10) ! 按数学定义计算统计量 sum_ = sum(arrayone) average = sum_ / firstnumber variance = sum( (arrayone - average)**2 ) / firstnumber standarddeviation = sqrt(variance) ! 输出结果 print*, "Average = ", average print*, "Standard Deviation = ", standarddeviation deallocate(arrayone) print*, "Done!" end program Assignmentthree
关键修改说明
- 移除读取首行的无限死循环,单次读取首个整数后直接读取后续数组内容,避免读到非整型内容触发类型错误
- 分配数组后一次性读取文件后续所有数值存入数组,不需要反复打开文件
- 修正标准差计算公式,先求所有元素与均值差的平方和,除以样本量得到方差后再开根号得到标准差
- 统一使用固定的IO单位号,避免单位号冲突导致的IO错误
内容的提问来源于stack exchange,提问作者Nik Wrye
相关产品推荐
相关产品推荐

