我需要使用fortran-77编写的旧程序。该程序以十六进制格式从文本文件中读取10个变量
open (2,file=filename, status='old', iostat=ios)
read (2,1) my_variables
1 format (/(10z8))
一个变量是字符串(字符* 4),我希望得到像'414E4950'十六进制到'ANIP'的smth。 但问题是,当我尝试从文件中读取数据时,我收到错误。
Fortran运行时错误:整数读取期间溢出的值
我该如何解决?
修改
看起来我太过简化了问题。 我的数据文件看起来像:
DATA_BLOCK_NAME
3D3 1 23BE 0 0 0 0 0 0 0
041200000414E4950 03F800000 0 16 23BF 0 0
0 0 0 0 0 041200000414E4950 03F800000
0 1E 23C0 0 0 0 0 0 0 0
我想把这些数据读成变量。
read (2,1) obj_num,((var_1(j,i),j=1,7),(var_2(j,i),j=1,3),var_3(i),
+ name(i),var_4(i),var_5(i),var_6(i),i=1,obj_num)
obj_num是整数* 4 var_1是整数* 4的数组 var_2,var_3,var_4,var_5,var_6是实数数组 但是(!)name是字符串数组(字符* 4)
正如您在数据文件中看到的每个第12个值编码对象名称(例如,'414E4950'到'ANIP'),我想将其存储为字符串。
P.S。
为了修复程序,我写了一些但很脏的修复。
read (2,1) obj_num,((var_1(j,i),j=1,7),(var_2(j,i),j=1,3),var_3(i),
+ tmp(i),var_4(i),var_5(i),var_6(i),i=1,obj_num)
do j=1,numcn
do i=1,4
tmp_name( i:i ) = CHAR(MOD(tmp(j), 256))
tmp(j) = RSHIFT(tmp(j), 8)
end do
ccns(j) = tmp_name
end do
其中tmp是整数* 4数组,tmp_str是字符* 4 它很难看,但很有效。
答案 0 :(得分:0)
出现错误是因为my_variables
被声明为和整数,您的格式看起来不太正确。因此,它试图从文件中读取整数,而不是十六进制。而且只是偶然的,读取为整数的值414E4950
只是Fortran无法处理的一个巨大数字。因此错误。
我会将格式更改为1 format (10z8)
。斜杠表示已达到当前记录的结尾,并跳过跳转到新行的所有其他内容。因此,在格式规范的开头使用它看起来不太正确。
另外,要读取10个具有不同数据类型的变量,您应该使用例如:
read (2,1), my_string_variable, my_variables(1), my_variables(2), my_variables(3), my_variables(4), my_variables(5), my_variables(6), my_variables(7), my_variables(8), my_variables(9)
最后,您可能需要使用DATA
语句。