Fortran Coder

标题: fortran十六进制数据读取 [打印本页]

作者: Richael_Liang    时间: 2018-7-24 16:16
标题: fortran十六进制数据读取
现在有这样的数据:icem生成的ansys fluent可以用的网格文件,数据格式如下:

输入文件:
(0 "Faces:" )
(13(0 1 28 0))
(13(3 1 28  3 0)(
7  3  5 0 0      
2  3  7 0 0  
2  8  1 0 0
7  8  2 0 0
7  6  8 0 0
5  6  1d 0 0
... (注:一共28H(十六进制)行 = 40(十进制)行)
))
需要输出节点数据:(每一行三个数是每一个节点的编号,每一行组成一个三角形)
7, 3, 5;
2, 3, 7;
2, 8, 1;
7, 8, 2;
7, 6, 8;
5, 6, 29;



如果用格式编辑符Z,那么需要指定长度,比如说 read(filenum,'(3z1)') 的话,1d这个十六进制数字就读不进来了。请问有什么好办法吗?

作者: li913    时间: 2018-7-24 17:13
看起来两个数字之间有空格,5^^6^^1d^,尖号表示空格。
这种格式,用  3z3
作者: fcode    时间: 2018-7-24 19:11
你的编译器支持 z0 吗?
作者: Richael_Liang    时间: 2018-7-25 00:11
fcode 发表于 2018-7-24 19:11
你的编译器支持 z0 吗?

嗯我的是IVF2011+vs2012
z0是什么呢?
我今天用了一个比较蹩脚的办法:先按照字符串读取 然后再把字符串按照Z格式转成数字
但是不知道这样会不会有bug
作者: Richael_Liang    时间: 2018-7-25 00:13
li913 发表于 2018-7-24 17:13
看起来两个数字之间有空格,5^^6^^1d^,尖号表示空格。
这种格式,用  3z3

两个十六进制数字之间只有一个空格。
而且网格数多了的话 会出现位数不一样,比如 1271 fd0 abcd3 这种位数不一致的情况,没法用z。
作者: kyra    时间: 2018-7-25 08:28
Richael_Liang 发表于 2018-7-25 00:11
嗯我的是IVF2011+vs2012
z0是什么呢?
我今天用了一个比较蹩脚的办法:先按照字符串读取 然后再把字符串 ...

read(filenum,'(3z0)')
作者: kyra    时间: 2018-7-25 08:29
Richael_Liang 发表于 2018-7-25 00:11
嗯我的是IVF2011+vs2012
z0是什么呢?
我今天用了一个比较蹩脚的办法:先按照字符串读取 然后再把字符串 ...

这是很高端的办法,并不蹩脚。
思路上没有bug,代码写得规范严谨的话,毫无破绽。
作者: pasuka    时间: 2018-7-25 08:49
本帖最后由 pasuka 于 2018-7-25 08:50 编辑

关键在于fortran、C或C++的标准里面没有字符串切割函数
建议用MATLAB或者python这样的脚本语言进行处理
[Python] 纯文本查看 复制代码
src = "1271 fd0 abcd3 5 6 1d"
rst = [int(x, 16) for x in src.split()]
print(rst)

输出
4721, 4048, 703699, 5, 6, 29
作者: Richael_Liang    时间: 2018-7-25 21:18
pasuka 发表于 2018-7-25 08:49
关键在于fortran、C或C++的标准里面没有字符串切割函数
建议用MATLAB或者python这样的脚本语言进行处理
[mw ...

感谢您的解答。之前弄不出来的时候打算用matlab了。但是后来用了先按字符串读取再转成数字的方法,对一个简单的网格文件读取成功了。不知道复杂情况如何,会不会出问题。
作者: Richael_Liang    时间: 2018-7-25 21:26
kyra 发表于 2018-7-25 08:29
这是很高端的办法,并不蹩脚。
思路上没有bug,代码写得规范严谨的话,毫无破绽。 ...

大概分为两步:
1. read(filenum,*) n1,n2,n3    !按照字符读取 这样就可以按照空格区分不同的数字了
2. read(n1,'(z4)') n4        ! 把字符n1转变为数字(十六进制)n4
ps:绫濑遥我女神!!!!敲可爱!!!

作者: kyra    时间: 2018-7-26 08:15
其实 read 可以用于数组读数组的。
[Fortran] 纯文本查看 复制代码
program main
  implicit none
  Character(len=33) :: src = "1271 fd0 abcd3 5 6 1d"
  Character(len=8) :: a(6)
  integer :: b(6)
  read( src , * ) a
  read( a , '(z8)' ) b
  write(*,*) b
end program main





欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2