Fortran Coder

查看: 19901|回复: 14
打印 上一主题 下一主题

[文件读写] 如何按行进行数据操作

[复制链接]

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
跳转到指定楼层
楼主
发表于 2017-1-29 21:32:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我在做一个计算积温的小程序,根据彭国伦计算学生成绩的例子做的,已经实现一整年积温的计算 ,现在我想根据第一列的天数 1.实现输入起止日期即起止行数,灵活的计算两个指定行之间的数据而不是简单的一整列的计算,不知道该怎末给指定行赋值 2.就是temp我现在是手动赋值 ,能不能根据文件行数自动赋值给它,我试着把获取文件行数的代码放进去,一放进去就提示mod不能用,大过年的打扰大家了
[Fortran] 纯文本查看 复制代码
01module typedef
02    type tdd
03        integer :: stat=0
04        real ::  tmax , tmin ,  total , average
05    end type
06end module
07 
08PROGRAM MAIN
09    USE typedef
10    implicit none
11    real::dy,rain
12    INTEGER,PARAMETER::temp=365
13    type(tdd)::t(temp)! 保存气温值
14    type(tdd):: total !日均温累加
15    integer i
16 
17    open(7,file="GDNH94")
18    read(7,*)
19 
20    do i=1,temp
21        read(7,*)dy , t(i)%tmax , t(i)%tmin , rain
22 
23        t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
24        total%average=total%average+t(i)%average    !日均温累加=积温
25    enddo
26    print *,total%average    !
27    STOP
28end PROGRAM

QQ截图20170129210133.png (5.26 KB, 下载次数: 569)

QQ截图20170129210133.png
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

955

帖子

0

主题

0

精华

大师

F 币
188 元
贡献
77 点

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

QQ
沙发
发表于 2017-1-29 23:16:58 | 只看该作者
本帖最后由 vvt 于 2017-1-29 23:26 编辑

问题1. 在你的例子里,已经把所有文件中的365行,都读入到内存里(t数组)了,所以你可以自由的操作内存(t数组),而不再需要管文件的第几行了。
   此外,行是文件的内容,如果你不需要修改文件内容。就不存在“怎么给行赋值”的问题。(行也不能,没法赋值)
   注意赋值是针对内存中的变量。文件内容只能(从文件)读取(到内存)或(从内存)写入(到文件)

问题2. 请给出代码和错误提示。

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
板凳
 楼主| 发表于 2017-1-31 10:20:07 | 只看该作者
本帖最后由 wxy 于 2017-1-31 11:32 编辑
vvt 发表于 2017-1-29 23:16
问题1. 在你的例子里,已经把所有文件中的365行,都读入到内存里(t数组)了,所以你可以自由的操作内存(t ...

谢谢 ,我还有一个问题,帮忙看一下第23行怎么改能够把start,end输入的值赋给i,没有错误提示。但是运行时还没赋值就输出了错误的结果
[Fortran] 纯文本查看 复制代码
01module typedef
02    type tdd
03        integer :: stat=0
04        real ::  tmax , tmin ,  total , average
05    end type
06end module
07 
08PROGRAM MAIN
09    USE typedef
10    implicit none
11    real::rain
12    INTEGER,PARAMETER::temp=365
13    type(tdd)::t(temp)! 保存气温值
14    type(tdd):: total !日均温累加
15    integer i,dy,start,end
16 
17    open(7,file="1988.txt")
18 
19    write(*,*)"start:"
20    read(7,*) start
21    write(*,*)"end:"
22    read(7,*) end
23 
24    do i=start,end
25 
26        read(7,*)dy , t(i)%tmax , t(i)%tmin , rain
27 
28        t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
29        total%average=total%average+t(i)%average    !日均温累加=积温
30    print *,dy , t(i)%tmax , t(i)%tmin , rain , total%average    !
31 
32    enddo
33    STOP
34end PROGRAM



QQ截图20170131113201.png (19.33 KB, 下载次数: 485)

QQ截图20170131113201.png

955

帖子

0

主题

0

精华

大师

F 币
188 元
贡献
77 点

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

QQ
地板
发表于 2017-1-31 15:42:53 | 只看该作者
你可以:
1. 只读取 start 到 end 之间的数据,然后计算。
2. 读取所有数据,然后只计算 start 到 end 之间的数据。

请选择其中一种方法。

如果你选用第一种方法,请先跳过第 1 到 第 start-1 的数据。
如果你选用第二种方法,请先完成所有数据的读取,然后再计算。(而不是一边读取一边计算)

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
5#
 楼主| 发表于 2017-1-31 18:07:54 | 只看该作者
本帖最后由 wxy 于 2017-1-31 18:40 编辑
vvt 发表于 2017-1-31 15:42
你可以:
1. 只读取 start 到 end 之间的数据,然后计算。
2. 读取所有数据,然后只计算 start 到 end 之间 ...

成功了 谢谢,但是还有两个问题 1.运行结果中把之前每行的均值累加结果都显示出来 我只想要输入的start,end之间所有行的和,也就是最后一行的结果才是我想要的,之前的代码显示的就只是一个结果,数据计算这部分的代码我并没有改动怎末显示的不一样呢
2.我用的是第一个方法,你提到的第二个方法在读取所有数据后,对数组进行计算,我想尝试一下,但脑子还是转不过来,数组也有行数列数,怎末对数组指定行之间进行计算呢,我看书上的例子都是对某一行进行操作


QQ截图20170131182927.png (22.54 KB, 下载次数: 494)

QQ截图20170131182927.png

955

帖子

0

主题

0

精华

大师

F 币
188 元
贡献
77 点

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

QQ
6#
发表于 2017-1-31 19:31:35 | 只看该作者
1.我不清楚你现在的代码是怎样的?数据文件是怎样的?你做了什么改动。因此,你的第一个问题我没办法回答。
2.你可以从你需要的开始,循环到你结束的位置,进行求和(或其他操作)。并不一定必须从数组的第一个循环到最后一个。

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
7#
 楼主| 发表于 2017-1-31 21:20:18 | 只看该作者
这是现在的代码
[Fortran] 纯文本查看 复制代码
01module typedef
02    type tdd
03        integer :: stat=0
04        real ::  tmax , tmin ,  total , average
05    end type
06end module
07 
08PROGRAM MAIN
09    USE typedef
10    implicit none
11    real::rain
12    INTEGER,PARAMETER::temp=366
13    type(tdd)::t(temp)! 保存气温值
14    type(tdd):: total !日均温累加
15    integer i , dy , start , end
16 
17    open(7,file="CN019067")
18    read(7,*)
19    write(*,*)"start:"
20    read(*,*) start
21    write(*,*)"end:"
22    read(*,*) end
23 
24    do i=1,start-1
25        read(7,*)
26    enddo
27    do i=start,end
28        read(7,*)dy , t(i)%tmax , t(i)%tmin , rain
29 
30        t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
31        total%average=total%average+t(i)%average    !日均温累加=积温
32    print *, dy,total%average    !
33    enddo
34    STOP
35end PROGRAM

QQ截图20170131211931.png (10.44 KB, 下载次数: 563)

QQ截图20170131211931.png

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
8#
 楼主| 发表于 2017-1-31 21:21:17 | 只看该作者
本帖最后由 wxy 于 2017-1-31 21:33 编辑
vvt 发表于 2017-1-31 19:31
1.我不清楚你现在的代码是怎样的?数据文件是怎样的?你做了什么改动。因此,你的第一个问题我没办法回答。 ...

这是现在的代码和文件,一开始发的代码 比如1-50行求和,会只显示50行和的值,这个代码会显示每一行跟前几行的和,直到第50行,
[Fortran] 纯文本查看 复制代码
01module typedef
02    type tdd
03        integer :: stat=0
04        real ::  tmax , tmin ,  total , average
05    end type
06end module
07 
08PROGRAM MAIN
09    USE typedef
10    implicit none
11    real::rain
12    INTEGER,PARAMETER::temp=366
13    type(tdd)::t(temp)! 保存气温值
14    type(tdd):: total !日均温累加
15    integer i , dy , start , end
16 
17    open(7,file="CN019067")
18    read(7,*)
19    write(*,*)"start:"
20    read(*,*) start
21    write(*,*)"end:"
22    read(*,*) end
23 
24    do i=1,start-1
25        read(7,*)
26    enddo
27    do i=start,end
28        read(7,*)dy , t(i)%tmax , t(i)%tmin , rain
29 
30        t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
31        total%average=total%average+t(i)%average    !日均温累加=积温
32    print *, dy,total%average    !
33    enddo
34    STOP
35end PROGRAM

QQ截图20170131211931.png (10.44 KB, 下载次数: 576)

QQ截图20170131211931.png

955

帖子

0

主题

0

精华

大师

F 币
188 元
贡献
77 点

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

QQ
9#
发表于 2017-1-31 21:52:10 | 只看该作者
本帖最后由 vvt 于 2017-1-31 21:54 编辑

把 print 放到循环外面不就可以了?
[Fortran] 纯文本查看 复制代码
1do i=start,end
2  read(7,*)dy , t(i)%tmax , t(i)%tmin , rain
3  t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
4  total%average=total%average+t(i)%average    !日均温累加=积温
5enddo
6print *, dy,total%average    !

如果你要全部365个都读完,然后再计算start到end的平均值,可以这样
[Fortran] 纯文本查看 复制代码
01PROGRAM MAIN
02  USE typedef
03  implicit none
04  real::rain
05  INTEGER,PARAMETER::temp=366
06  type(tdd)::t(temp)! 保存气温值
07  type(tdd):: total !日均温累加
08  integer i , dy , start , end
09 
10  open(7,file="CN019067")
11  read(7,*)
12  write(*,*)"start:"
13  read(*,*) start
14  write(*,*)"end:"
15  read(*,*) end
16  do i=1,temp
17    read(7,*)dy , t(i)%tmax , t(i)%tmin , rain
18    t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
19  end do
20  total%average = 0
21  do i=start,end
22    total%average=total%average+t(i)%average    !日均温累加=积温
23  enddo
24  print *, dy,total%average    !
25end PROGRAM

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
10#
 楼主| 发表于 2017-1-31 22:04:24 | 只看该作者
本帖最后由 wxy 于 2017-1-31 22:19 编辑
vvt 发表于 2017-1-31 21:52
把 print 放到循环外面不就可以了?

嗯嗯 太感谢了 然后就是请问一下 temp=366,366其实是行数 ,我想用获取行数的代码赋给temp,理论上是否是对的,temp=366是声明数组大小吧,获取行数代码放在后面赋值给temp 好像顺序反了,如果理论上可以 应该放在什么位置
[Fortran] 纯文本查看 复制代码
1I=0
2  do while (.true.)
3    READ(8,*,end=100) line
4    i=i+1
5  end do
6  100 CONTINUE
7   m=i-4
8  rewind(8)


您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-5-3 01:22

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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