Fortran Coder

楼主: wxy
打印 上一主题 下一主题

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

[复制链接]

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
楼主
发表于 2017-1-29 23:16:58 | 显示全部楼层
本帖最后由 vvt 于 2017-1-29 23:26 编辑

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

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

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
沙发
发表于 2017-1-31 15:42:53 | 显示全部楼层
你可以:
1. 只读取 start 到 end 之间的数据,然后计算。
2. 读取所有数据,然后只计算 start 到 end 之间的数据。

请选择其中一种方法。

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

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

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

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
地板
发表于 2017-1-31 21:52:10 | 显示全部楼层
本帖最后由 vvt 于 2017-1-31 21:54 编辑

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

如果你要全部365个都读完,然后再计算start到end的平均值,可以这样
[Fortran] 纯文本查看 复制代码
PROGRAM MAIN
  USE typedef
  implicit none
  real::rain
  INTEGER,PARAMETER::temp=366
  type(tdd)::t(temp)! 保存气温值
  type(tdd):: total !日均温累加
  integer i , dy , start , end

  open(7,file="CN019067")
  read(7,*)
  write(*,*)"start:"
  read(*,*) start
  write(*,*)"end:"
  read(*,*) end
  do i=1,temp
    read(7,*)dy , t(i)%tmax , t(i)%tmin , rain
    t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
  end do
  total%average = 0
  do i=start,end
    total%average=total%average+t(i)%average    !日均温累加=积温
  enddo
  print *, dy,total%average    !
end PROGRAM

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
5#
发表于 2017-1-31 23:46:22 | 显示全部楼层
本帖最后由 vvt 于 2017-1-31 23:48 编辑

[Fortran] 纯文本查看 复制代码
PROGRAM MAIN
  USE typedef
  implicit none
  real::rain
  type(tdd),allocatable::t(:)! 保存气温值
  type(tdd):: total !日均温累加
  integer i , m , dy , start , end
  character(len=3) :: line
  open(7,file="CN019067")
  I=0
  do
    READ(7,*,end=100) line
    i=i+1
  end do
  100 m = i - 1 !//你这个前面只多了一行
  rewind(7)
  allocate( t(m))  
  read(7,*)
  write(*,*)"start:"
  read(*,*) start
  write(*,*)"end:"
  read(*,*) end
  do i=1,m
    read(7,*)dy , t(i)%tmax , t(i)%tmin , rain
    t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
  end do
  total%average = 0
  do i=start,end
    total%average=total%average+t(i)%average    !日均温累加=积温
  enddo
  print *, dy,total%average    !
end PROGRAM

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
6#
发表于 2017-2-1 10:02:30 | 显示全部楼层
你欠缺一点对程序的理解。
文件的行数,必须运行的时候才能判断,然后才能知道数组的大小。
运行以后才知道大小的数组,就得用动态数组。
有两个时间很重要:编译时,和运行时

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

本版积分规则

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

GMT+8, 2024-6-13 19:51

Powered by Tencent X3.4

© 2013-2024 Tencent

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