Fortran从文件中读取十六进制为ASCII

时间:2016-11-29 11:11:31

标签: fortran ascii

我需要使用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 它很难看,但很有效。

1 个答案:

答案 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语句。