Fortran Coder

查看: 18647|回复: 10

[输入输出] fortran十六进制数据读取

[复制链接]

5

帖子

1

主题

0

精华

入门

F 币
40 元
贡献
20 点
发表于 2018-7-24 16:16:06 | 显示全部楼层 |阅读模式
现在有这样的数据: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这个十六进制数字就读不进来了。请问有什么好办法吗?

790

帖子

2

主题

0

精华

大宗师

F 币
3765 元
贡献
2255 点
发表于 2018-7-24 17:13:51 | 显示全部楼层
看起来两个数字之间有空格,5^^6^^1d^,尖号表示空格。
这种格式,用  3z3

1948

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1298 元
贡献
547 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2018-7-24 19:11:04 | 显示全部楼层
你的编译器支持 z0 吗?

5

帖子

1

主题

0

精华

入门

F 币
40 元
贡献
20 点
 楼主| 发表于 2018-7-25 00:11:38 | 显示全部楼层
fcode 发表于 2018-7-24 19:11
你的编译器支持 z0 吗?

嗯我的是IVF2011+vs2012
z0是什么呢?
我今天用了一个比较蹩脚的办法:先按照字符串读取 然后再把字符串按照Z格式转成数字
但是不知道这样会不会有bug

5

帖子

1

主题

0

精华

入门

F 币
40 元
贡献
20 点
 楼主| 发表于 2018-7-25 00:13:35 | 显示全部楼层
li913 发表于 2018-7-24 17:13
看起来两个数字之间有空格,5^^6^^1d^,尖号表示空格。
这种格式,用  3z3

两个十六进制数字之间只有一个空格。
而且网格数多了的话 会出现位数不一样,比如 1271 fd0 abcd3 这种位数不一致的情况,没法用z。

235

帖子

0

主题

0

精华

版主

World Analyser

F 币
630 元
贡献
464 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
发表于 2018-7-25 08:28:17 | 显示全部楼层
Richael_Liang 发表于 2018-7-25 00:11
嗯我的是IVF2011+vs2012
z0是什么呢?
我今天用了一个比较蹩脚的办法:先按照字符串读取 然后再把字符串 ...

read(filenum,'(3z0)')

235

帖子

0

主题

0

精华

版主

World Analyser

F 币
630 元
贡献
464 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
发表于 2018-7-25 08:29:34 | 显示全部楼层
Richael_Liang 发表于 2018-7-25 00:11
嗯我的是IVF2011+vs2012
z0是什么呢?
我今天用了一个比较蹩脚的办法:先按照字符串读取 然后再把字符串 ...

这是很高端的办法,并不蹩脚。
思路上没有bug,代码写得规范严谨的话,毫无破绽。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

发表于 2018-7-25 08:49:28 | 显示全部楼层
本帖最后由 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

5

帖子

1

主题

0

精华

入门

F 币
40 元
贡献
20 点
 楼主| 发表于 2018-7-25 21:18:49 | 显示全部楼层
pasuka 发表于 2018-7-25 08:49
关键在于fortran、C或C++的标准里面没有字符串切割函数
建议用MATLAB或者python这样的脚本语言进行处理
[mw ...

感谢您的解答。之前弄不出来的时候打算用matlab了。但是后来用了先按字符串读取再转成数字的方法,对一个简单的网格文件读取成功了。不知道复杂情况如何,会不会出问题。

5

帖子

1

主题

0

精华

入门

F 币
40 元
贡献
20 点
 楼主| 发表于 2018-7-25 21:26:07 | 显示全部楼层
kyra 发表于 2018-7-25 08:29
这是很高端的办法,并不蹩脚。
思路上没有bug,代码写得规范严谨的话,毫无破绽。 ...

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

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-3-29 15:15

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表