24小时热门版块排行榜    

查看: 2475  |  回复: 14

david830wu

新虫 (初入文坛)

[求助] Fortran的格式化输入输出问题

下面是一个矩阵的内容,在文件里,想用Fortran读入,应该怎样做呢?
难点在于,空格数不固定,数字的长度也不固定,Fortran有没有能像C++那样的自动跳过空格,自动控制长度的智能读入呢?

Matrix.dat:
1 2  3   45 2
341 3 221 2 45
21     45     3 23 3
1           32 2     34 33
45  36   39    81 4

谢谢啦!
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖支持 ( 显示支持度最高的前 50 名 )

snoopyzhao

至尊木虫 (职业作家)

★ ★
jjdg(金币+2): 感谢参与 2011-07-22 01:38:55
给一个我写的 Fortran 90 版本的程序,没有加前面的准备字符串部分,呵呵,希望不难懂理解……
CODE:
program read_hex

implicit none
character(len=80) :: line="3 5  F6F  1d 0 0"
character(len=80) :: buff, hex_str, fm
integer, dimension(3) :: hex
integer :: str_len, i, first, last

buff = adjustl(line)
str_len = len_trim(buff)

!! remove the extra space in the string
do i=1,str_len-1
   if (buff(i:i) == ' ' .and. buff(i+1:i+1) == ' ') buff(i:) = buff(i+1:)
end do

!! extract the hexadecimal constant
first = 1
do i=1,3
   first = index(buff(first:), ' ') + first - 1
   last = index(buff(first+1:), ' ') + first
   hex_str = buff(first+1:last-1)
   write(fm, '(a,i0,a)') '(Z', len_trim(hex_str), ')'
   read(hex_str, fm) hex(i)
   first = last
end do

!! hexadecimal to decimal constrant, and output...
write(*,*) hex

end program read_hex

11楼2011-07-21 11:45:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zengkehl

铜虫 (小有名气)

引用回帖:
5楼: Originally posted by david830wu at 2011-07-18 13:08:23
嗯,我这个问题已经解决了:
Buffer = "3  2a  5  f0  0  0"  ! 就是说2a, 5, f0为三角网格的三个节点的索引,就是所要的数据,程序如下:
        !------------------------------------------------------- ...

楼主,我现在也碰到你的这个问题了,能不能告诉我如何解决啊,我也是从fluent上读取了点的编号,及其坐标值,我把生成的txt文件整理了下,发现数据之间没有空格,然后我用fortran编程把这些数据读出来的时候报错了,楼主能说下当时你是怎么解决的么,我的相关数据文件和程序在下面

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:libolin3@tal.com
  • 附件 1 : Source1.f90
  • 2013-04-27 20:49:46, 293 bytes
  • 附件 2 : 点坐标.txt
  • 2013-04-27 20:50:12, 31.7 K
14楼2013-04-27 20:50:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

★ ★
david830wu(金币+5): 嗯,以前陷到格式化输出的沟里了,其实用“*”就好了。非常感谢! 2011-07-17 17:24:03
xzhdty(金币+2): 欢迎常来 2011-07-17 21:51:22
你每行都是一样多的数字吗?或者说,你的 matrix 的维数是已知的吗?

直接
CODE:
read(12, *) ((a(i,j), i=1,5),j=1,5)

不行吗?

当然,这里都是以浮点数读入的,你可以转一下,呵呵……
2楼2011-07-17 17:13:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

david830wu

新虫 (初入文坛)

★ ★
dubo(金币+1): 欢迎常来程序语言版讨论 2011-07-17 22:51:32
dubo(金币+1): 欢迎常来程序语言版讨论 2011-07-17 22:52:42
再进一步问一下,也是我真实遇到的,就是GAMBIT的网格划分文件,数据文件是十六进制应该怎么办呢?
MATRIX.dat
1   3f  a6    21   4
a cc        f3      2  2
3    d0    b2    46   4
……
这样的文件用“*”好像就不行了,如果后面加option:Zn[.m]的话就得指定宽度,这应该怎么处理?
3楼2011-07-17 18:45:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


dubo(金币+1): 欢迎常来程序语言版讨论 2011-07-17 22:51:45
引用回帖:
Originally posted by david830wu at 2011-07-17 18:45:35:
再进一步问一下,也是我真实遇到的,就是GAMBIT的网格划分文件,数据文件是十六进制应该怎么办呢?
MATRIX.dat
1   3f  a6    21   4
a cc        f3      2  2
3    d0    b2    46   4
……
这样的文件用 ...

这个没有啥好办法,将多个空格替换为一个空格,然后按字符串读入,以空格划分,再以内部文件的方式格式化读入……
4楼2011-07-17 19:44:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

david830wu

新虫 (初入文坛)


dubo(金币+1): 欢迎常来程序语言版讨论 2011-07-31 13:21:47
嗯,我这个问题已经解决了:
Buffer = "3  2a  5  f0  0  0"  ! 就是说2a, 5, f0为三角网格的三个节点的索引,就是所要的数据,程序如下:
        !------------------------------------------------------------------------
        ! This subroutine results the indices of the three node, which
        ! forms the triangle face, givening a character string buffer.
        ! node_list is a dimension(3) integer vector which saves the indices of
        ! the three nodes.
        subroutine import_face(buffer, node_list)
                implicit none
                character(len = *), intent(in) :: buffer
                integer, dimension(3) :: node_list
                integer, dimension(4) :: hex_buffer
                integer :: i, j, m
               
                j = 3
                do i = 1, 3
                        do while(buffer(j:j) == ' ')
                                j = j + 1
                        end do
                        m = 1
                        do while(buffer(j:j) /= ' ' .and. m < 5)
                                read(buffer(j:j),"(Z1)" hex_buffer(m)
                                m = m + 1
                                j = j + 1
                        end do
                        m = m - 1
                        node_list(i) =  hex_buffer(1)*(16**(m-1))+hex_buffer(2)*(16**(m-2))+hex_buffer(3)*(16**(m-3))+hex_buffer(4)*1
                end do
        end subroutine import_face

鼓励批评改进啊!
5楼2011-07-18 13:08:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


jjdg(金币+1): 感谢参与 2011-07-18 20:07:11
看不懂你要做什么?
6楼2011-07-18 15:16:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

david830wu

新虫 (初入文坛)


dubo(金币+1): 欢迎常来程序语言版讨论 2011-07-31 13:21:58
引用回帖:
Originally posted by snoopyzhao at 2011-07-18 15:16:10:
看不懂你要做什么?

不好意思啊,是我没说清楚的,事情是这样的,我希望利用ANSYS公司的GAMBIT组件,这是一个专门为有限元做网格划分的软件,做前台进行网格分划,将一个几何面形划分成三角形,后面自己写程序做计算的,而GAMBIT的网格分划的输出文件是.msh文件,其中分划形成的三角形网格的数据的格式是:

(0 "Faces:"     ! 这是注释行
(13(0 1 28 0)) ! 13是说表示面单元,索引从01H~28H,就是一共有40个三角形
(13(3 1 28  3 0)( ! 是说边界三角形的索引从01H~0cH,就是说有边界有12三角形
3 7  3  5 0 0       ! 表明第7H个节点,第3H个节点,第5H个节点形成一个三角形
3 2  3  7 0 0       ! 以此类推……
3 2  8  1 0 0
3 7  8  2 0 0
3 7  6  8 0 0
3 5  6  1d 0 0
……

我做的事情就是把这个文件中三角形网格的节点信息读出来,存在一个数组中,就这么简单。
7楼2011-07-18 23:12:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


jjdg(金币+1): 感谢你的积极参与 2011-07-19 10:43:15
能说得更简单一些吗?抛开所谓的专业,呵呵……
也就是说,我的输入是什么,我的输出是什么?
8楼2011-07-19 08:49:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

david830wu

新虫 (初入文坛)

xzhdty: 欢迎常来 2011-07-20 07:41:43
引用回帖:
Originally posted by snoopyzhao at 2011-07-19 08:49:58:
能说得更简单一些吗?抛开所谓的专业,呵呵……
也就是说,我的输入是什么,我的输出是什么?

输入文件:
(0 "Faces:" )
(13(0 1 28 0))
(13(3 1 28  3 0)(
3 7  3  5 0 0      
3 2  3  7 0 0  
3 2  8  1 0 0
3 7  8  2 0 0
3 7  6  8 0 0
3 5  6  1d 0 0
... (一共28H行 = 40行)
))
输出数据:
integer :: N = 28H = 40
integer, dimension(N,3) :: node_list
其中 node_list =
7, 3, 5;
2, 3, 7;
2, 8, 1;
7, 8, 2;
7, 6, 8;
5, 6, 29;
... (一共四十行)

不知道我这回说清楚了吗?
9楼2011-07-19 22:11:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


jjdg(金币+1): 感谢你的热心参与 2011-07-21 10:07:19
看这个意思,是从6个16进制的数据中,读取其中的三个,然后返回3个对应的十进制数,是吧?
10楼2011-07-21 09:58:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 david830wu 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[硕博家园] 关于硕博连读的一些疑问? +4 Lwenter 2024-06-14 5/250 2024-06-17 20:42 by Lwenter
[基金申请] 太卷了 +11 shuigubio 2024-06-17 22/1100 2024-06-17 19:53 by 胖虎
[考博] 这个博士要读吗 +9 Sea Breeze 2024-06-16 17/850 2024-06-17 19:50 by zeolitess
[高分子] 寻找聚酯反应釜 +3 茕茕恭煮 2024-06-15 4/200 2024-06-17 18:18 by sunliyan123
[考博] 2025考博 +7 自强不息a?a 2024-06-15 11/550 2024-06-17 18:13 by 小木雄子
[基金申请] 我标书代码变了 +44 学员NHuqdk 2024-06-16 58/2900 2024-06-17 17:39 by wenfengw83
[考博] 34岁读博士晚吗 +30 emitdne 2024-06-13 30/1500 2024-06-17 17:08 by 白米粒向日葵
[基金申请] 2024国社科通讯评审 +11 qsd10086 2024-06-13 21/1050 2024-06-17 15:49 by 张郎才进
[文学芳草园] 累并快乐着 +14 MYHLD521 2024-06-14 14/700 2024-06-17 14:51 by shl2112501
[教师之家] 请问事业编制和年薪制冲突吗? +10 ZHONGWU_U 2024-06-14 10/500 2024-06-17 14:44 by 周周520
[硕博家园] 博士毕业高校和就业的相关问题 +6 SCITOPPP 2024-06-14 10/500 2024-06-17 10:08 by SCITOPPP
[论文投稿] 二审返修送审10天了,原来一审的3个审稿人只有2个接受了审稿,会邀请新审稿人么? 50+3 huanpo116 2024-06-15 5/250 2024-06-16 10:27 by bobvan
[论文投稿] 投稿被一个审稿人恶意评审了怎么样? +5 1chen 2024-06-14 7/350 2024-06-15 23:15 by xy66xy
[考博] 上海交大招收材料化学方向科研助理/“申请考核”博士(已招满) +3 灵梦and紫 2024-06-12 4/200 2024-06-15 20:58 by 1822836277
[论文投稿] 投稿后发现其他作者的邮箱填错了该怎么办呀 10+4 在飞的猪 2024-06-13 6/300 2024-06-14 04:45 by 小虫子咔咔
[硕博家园] 科研求助 +5 杲www 2024-06-12 6/300 2024-06-13 16:16 by 姓李名明
[硕博家园] 机械研究生如何拿到年薪40+w +13 阿巴阿巴哦哦 2024-06-11 15/750 2024-06-13 15:40 by 113745685
[硕博家园] 考博应该从哪里开始准备 +6 亮姐2019 2024-06-11 8/400 2024-06-13 12:53 by 帕秋莉GO
[论文投稿] with editor日期变更 +3 慎独的小花卷 2024-06-12 8/400 2024-06-13 11:00 by 慎独的小花卷
[论文投稿] 摩擦磨损论文投稿 +3 jmysan 2024-06-12 3/150 2024-06-13 08:36 by 莱茵润色
信息提示
请填处理意见