Fortran Coder

查看: 10384|回复: 5
打印 上一主题 下一主题

[输入输出] 文件的读取与写出问题

[复制链接]

13

帖子

3

主题

0

精华

入门

F 币
74 元
贡献
41 点
跳转到指定楼层
楼主
发表于 2018-4-16 16:10:32 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
如图一,画红圈的是我读取文件的单元名称,我需要将这个读入的数据变成图二的样式。规律是画红圈的部分,前两个字符不变,后面的字符从末尾气依次加一。前两个字符相同的单元号,其后面对应的数值也不变,我编的程序如图三,图四所示,但是导出的文件的结果如图五所示,通过程序编译,可知问题应该是发生在图六画红圈的部分,但是我不知如何修改吗,希望大神能帮我看一下应该如何修改?
代码如下:
[Fortran] 纯文本查看 复制代码
01module typedef
02    type para
03            character(len=2) line
04            integer :: column,addcolumn
05            character(len=3) stateindex
06            character(len=1) colon
07            character(len=1) pressure
08            character(len=1) commaa
09            character(len=15) variables
10            real(kind=8) :: porosity,Numcon1,Numcon2,Numcon3,Numcon4
11    end type
12    end module
13     
14         
15    program main
16    use typedef
17    implicit none
18    integer,parameter :: fileid = 3                       ! number of save.txt
19    integer,parameter :: fileids = 4                      ! number of INCON.txt
20    integer,parameter :: linenum = 2                      ! the number of lines,can change
21    integer,parameter :: columnnum = 150                      ! the number of column,can change
22    character(len=80) title
23    type(para) :: s(linenum)                              ! save the parameters of save.txt
24    type(para) :: a(columnnum)                            ! save the parameters of columnnum
25    integer i,j,error,truecolumn
26     
27    truecolumn=5
28    open( fileid,file="save.txt",status="old",iostat=error)
29    if(error/=0)then
30        write(*,*)"open save.txt fail."
31        stop
32    end if
33     
34    OPEN(UNIT=fileids,FILE='INCON.txt',FORM='FORMATTED',STATUS='NEW',IOSTAT=error)
35          if(error/=0) then
36              write(*,*)"open elem_elem.txt fail"
37              stop
38          end if
39     
40    read(fileid,*) title
41    write(fileids,"(A80)") title
42     
43    do i=1,linenum
44    read(fileid,FMT = 5001) s(i)%line,s(i)%column,s(i)%porosity,s(i)%stateindex,s(i)%colon,s(i)%pressure,s(i)%commaa,s(i)%variables,s(i)%Numcon1,s(i)%Numcon2,s(i)%Numcon3,s(i)%Numcon4
45    write(fileids,FMT=5001) s(i)%line,s(i)%column,s(i)%porosity,s(i)%stateindex,s(i)%colon,s(i)%pressure,s(i)%commaa,s(i)%variables,s(i)%Numcon1,s(i)%Numcon2,s(i)%Numcon3,s(i)%Numcon4
46    a(i)%addcolumn = s(i)%column
47    a(i)%line = s(i)%line
48    a(i)%porosity = s(i)%porosity
49    a(i)%stateindex = s(i)%stateindex
50    a(i)%colon = s(i)%colon
51    a(i)%pressure = s(i)%pressure
52    a(i)%commaa = s(i)%commaa
53    a(i)%variables = s(i)%variables
54    a(i)%Numcon1 = s(i)%Numcon1
55    a(i)%Numcon2 = s(i)%Numcon2
56    a(i)%Numcon3 = s(i)%Numcon3
57    a(i)%Numcon4 = s(i)%Numcon4
58    do j=1,truecolumn
59        a(j)%addcolumn=a(j)%addcolumn+j
60        write(fileids,FMT=5001) a(i)%line,a(j)%addcolumn,a(i)%porosity,a(i)%stateindex,a(i)%colon,a(i)%pressure,a(i)%commaa,a(i)%variables,a(i)%Numcon1,a(i)%Numcon2,a(i)%Numcon3,a(i)%Numcon4
61    end do
62    end do
63     
64!      do i=1,linenum
65!          write(fileids,FMT=5001) s(i)%line,s(i)%column,s(i)%porosity,s(i)%stateindex,s(i)%colon,s(i)%pressure,s(i)%commaa,s(i)%variables,s(i)%Numcon1,s(i)%Numcon2,s(i)%Numcon3,s(i)%Numcon4
66!      end do
67!      stop
685001      FORMAT(A2,A3,11X,ES14.8,2X,A3,A1,1X,A1,A1,5X,A15/1X,ES19.13,1X,ES19.13,1X,ES19.13,1X,ES19.13)
69          end program

1.png (98.16 KB, 下载次数: 363)

图一

图一

2.png (118.12 KB, 下载次数: 385)

图二

图二

3.png (28.41 KB, 下载次数: 383)

图三

图三

4.png (25.37 KB, 下载次数: 375)

图四

图四

5.png (63.13 KB, 下载次数: 380)

图五

图五

图六.png (150.83 KB, 下载次数: 364)

图六

图六
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

13

帖子

3

主题

0

精华

入门

F 币
74 元
贡献
41 点
6#
 楼主| 发表于 2018-4-18 10:33:40 | 只看该作者
fcode 发表于 2018-4-17 22:04
[mw_shl_code=fortran,true]其实你可以这样定义结构体
type para
            character(len=3) line

非常感谢您的意见,我已经做出修改

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

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

5#
发表于 2018-4-17 22:04:37 | 只看该作者
其实你可以这样定义结构体
[Fortran] 纯文本查看 复制代码
01type para
02            character(len=3) line
03            integer :: column
04           real(8) :: porosity
05            character(len=3) stateindex
06            character(len=1) colon
07            character(len=1) pressure
08            character(len=1) commaa
09            character(len=15) variables
10            real(kind=8) :: Numcon(4)
11    end type


这样有个好处,就是不再需要写
read(fileid,FMT = 5001) s(i)%line,s(i)%column,s(i)%porosity,s(i)%stateindex,s(i)%colon,s(i)%pressure,s(i)%commaa,s(i)%variables,s(i)%Numcon1,s(i)%Numcon2,s(i)%Numcon3,s(i)%Numcon4
而可以简单的写成
read(fileid,5001) s(i)

当然你还要调整 5001 format 的顺序。

非常方便

13

帖子

3

主题

0

精华

入门

F 币
74 元
贡献
41 点
地板
 楼主| 发表于 2018-4-17 18:24:11 | 只看该作者
我自己解决了我的问题,下面把我修改的程序贴出来
[Fortran] 纯文本查看 复制代码
01module typedef
02    type para
03            character(len=3) line
04            integer :: column
05            character(len=3) stateindex
06            character(len=1) colon
07            character(len=1) pressure
08            character(len=1) commaa
09            character(len=15) variables
10            real(kind=8) :: porosity,Numcon1,Numcon2,Numcon3,Numcon4
11    end type
12    end module
13     
14         
15    program main
16    use typedef
17    implicit none
18    integer,parameter :: fileid = 3                       ! number of save.txt
19    integer,parameter :: fileids = 4                      ! number of INCON.txt
20    integer,parameter :: linenum = 2                      ! the number of lines,can change
21    integer,parameter :: columnnum = 150                      ! the number of column,can change
22    character(len=80) title
23    type(para) :: s(linenum)                              ! save the parameters of save.txt
24    integer i,j,error,truecolumn
25     
26    truecolumn=5
27    open( fileid,file="save.txt",status="old",iostat=error)
28    if(error/=0)then
29        write(*,*)"open save.txt fail."
30        stop
31    end if
32     
33    OPEN(UNIT=fileids,FILE='INCON.txt',FORM='FORMATTED',STATUS='NEW',IOSTAT=error)
34          if(error/=0) then
35              write(*,*)"open elem_elem.txt fail"
36              stop
37          end if
38     
39    read(fileid,*) title
40    write(fileids,"(A80)") title
41     
42    do i=1,linenum
43    read(fileid,FMT = 5001) s(i)%line,s(i)%column,s(i)%porosity,s(i)%stateindex,s(i)%colon,s(i)%pressure,s(i)%commaa,s(i)%variables,s(i)%Numcon1,s(i)%Numcon2,s(i)%Numcon3,s(i)%Numcon4
44    write(fileids,FMT=5001) s(i)%line,s(i)%column,s(i)%porosity,s(i)%stateindex,s(i)%colon,s(i)%pressure,s(i)%commaa,s(i)%variables,s(i)%Numcon1,s(i)%Numcon2,s(i)%Numcon3,s(i)%Numcon4
45    do j=1,truecolumn
46        s(i)%column=MOD(j,100)
47        write(fileids,FMT=5001) s(i)%line,s(i)%column,s(i)%porosity,s(i)%stateindex,s(i)%colon,s(i)%pressure,s(i)%commaa,s(i)%variables,s(i)%Numcon1,s(i)%Numcon2,s(i)%Numcon3,s(i)%Numcon4
48    end do
49    end do
50     
51 
52!      do i=1,linenum
53!          write(fileids,FMT=5001) s(i)%line,s(i)%column,s(i)%porosity,s(i)%stateindex,s(i)%colon,s(i)%pressure,s(i)%commaa,s(i)%variables,s(i)%Numcon1,s(i)%Numcon2,s(i)%Numcon3,s(i)%Numcon4
54!      end do
55!      stop
56 
575001      FORMAT(A3,I2.2,11X,ES14.8,2X,A3,A1,1X,A1,A1,5X,A15/1X,ES19.13,1X,ES19.13,1X,ES19.13,1X,ES19.13)
58          end program


13

帖子

3

主题

0

精华

入门

F 币
74 元
贡献
41 点
板凳
 楼主| 发表于 2018-4-17 17:13:35 | 只看该作者
vvt 发表于 2018-4-17 01:08
对于大段的代码,请直接复制粘贴,不截图。
对于输入文件也是一样。

好的,我已经修复了帖子

955

帖子

0

主题

0

精华

大师

F 币
188 元
贡献
77 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2018-4-17 01:08:53 | 只看该作者
对于大段的代码,请直接复制粘贴,不截图。
对于输入文件也是一样。

截图不能复制粘贴,对于想要帮助你的人来说,需要照着图片敲一遍代码,才能帮助你测试。这是很复杂的一件事情。

(请注意,通过眼睛看出错误,是很难的)
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-4-25 23:04

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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