24小时热门版块排行榜    

CyRhmU.jpeg
查看: 3492  |  回复: 21
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

duhb655

金虫 (著名写手)

[求助] fortran 怎么按行读取数据(有小例子)已有3人参与

深度              温度              电导率
50.00000          28.30186          54.27303
51.00000          28.28920          54.27039               
52.00000          28.27396          54.26752                 
53.00000          28.25474          54.27453                  
54.00000          28.23691          54.28119                 
55.00000          28.23033          54.29279                  
56.00000          28.22947          54.30813                  
57.00000          28.21856          54.30784               
58.00000          28.20773          54.31368                 
59.00000          28.19656          54.32171                  
60.00000          28.15063          54.28722
我用的是网上的一个数据,我写的程序为:
CODE:
PROGRAM TE
REAL::A(11,3)
INTEGER ::I,J
CHARACTER C
OPEN(13,FILE='Result.txt')
DO J=1,1
   READ(13,*)C
ENDDO
OPEN(12,FILE='result1.TXT')
DO I=1,11
   READ(13,*) A(I,1:3)
ENDDO
WRITE(12,"(3f10.5)") A
CLOSE(13)
CLOSE(12)
END

得到的结果是:
50.00000  51.00000  52.00000
  53.00000  54.00000  55.00000
  56.00000  57.00000  58.00000
  59.00000  60.00000  28.30186
  28.28920  28.27396  28.25474
  28.23691  28.23033  28.22947
  28.21856  28.20773  28.19656
  28.15063  54.27303  54.27039
  54.26752  54.27453  54.28119
  54.29279  54.30813  54.30784
  54.31368  54.32171  54.28722
我想得到原来一样的数据,我看结果意思是按列读取,怎么能按行读取啊,或怎么能得到和原来一样的矩阵,如果可能的话,不要用A1,A2,A3三列来做,因为我的数据有很多列,谢谢了!

[ Last edited by jjdg on 2014-2-9 at 10:07 ]
回复此楼

» 收录本帖的淘帖专辑推荐

经验

» 猜你喜欢

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

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
duhb655: 金币+10, ★★★很有帮助 2014-02-09 23:49:27
xzhdty: 金币+1, 谢谢参与 2014-02-10 08:48:22
jjdg: 编辑内容 2014-02-13 11:49
读的并没有错,也是按行读的,Fortran 还没有高级到可以按列来读入数据的

错的在于你打印的那句话:
WRITE(12,"(3f10.5)" ) A
这句话只是告诉程序把 A 这个 矩阵中的数据打出来,每行三个实数

但你要清楚的是 Fortran 内部的矩阵存贮是列优先的,所以,它先把第一列拿出来打印,打印完了打印第二列,再打印第三列

你要想按读的方式打印,就要显示地写成循环或者使用 WRITE 支持的隐式循环……

[ Last edited by jjdg on 2014-2-13 at 11:49 ]
4楼2014-02-09 13:21:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

引用回帖:
6楼: Originally posted by physliebe at 2014-02-09 19:33:13
WRITE(12,"(3f10.5)"; ) A,这种输出矩阵的方法试了一下,报错...

那是因为这个论坛的什么表情的缘故,我是直接抄你的代码的。我的意思就是那句话给你的Fortran是按列读取的错觉。
11楼2014-02-10 02:25:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

引用回帖:
8楼: Originally posted by duhb655 at 2014-02-09 23:52:07
不好意思,BB没了,就送红花一朵。这个我好像解决了,但有个问题,原TXT中有的列是整型有的是实型,我这样一下全给别人弄成实型了,麻烦您看一下7楼,不知道您能不能给点意见,谢谢啦!...

你要想整型的读成整型,实型的读成实型,那就得用类似 2I5,2F7.5 这种方式来读取了……
12楼2014-02-10 02:27:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

引用回帖:
8楼: Originally posted by duhb655 at 2014-02-09 23:52:07
不好意思,BB没了,就送红花一朵。这个我好像解决了,但有个问题,原TXT中有的列是整型有的是实型,我这样一下全给别人弄成实型了,麻烦您看一下7楼,不知道您能不能给点意见,谢谢啦!...

前面的回复不对

如果你用一个矩阵来存贮前面的那个文本,你只能指定一种类型,在你这种情况下自然只能是实型……
13楼2014-02-10 02:35:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


jjdg: 金币+1, 辛苦了 2014-02-13 11:52:05
引用回帖:
7楼: Originally posted by duhb655 at 2014-02-09 23:47:30
zhao老师,要不您帮帮忙,我给出一个小例子,然后我说出想要做什么(很简单),然后您帮我写一下主要的句子我学习学习,行不。TXT数据如下:
50     40     28.30186          54.27303
51     41     28.28920  ...

一个 A 是没有办法既存整弄,又存实型的。分成两个可以:
CODE:
PROGRAM test

   IMPLICIT NONE
   INTEGER :: i, ios
   INTEGER, DIMENSION(11,2) :: c1_2
   REAL, DIMENSION(11,2) :: c3_4
   
   OPEN(UNIT = 12, FILE = 'aa.txt')
   
   DO i=1,11
      READ(12,'(I2,TR5,I2,TR5,F8.5,TR10,F8.5)') c1_2(i,:), c3_4(i,:)
   END DO
   
   DO i=1,11
      WRITE(*, '(2(TR2,I2),2(TR2,F8.5))') c1_2(i,:), c3_4(i,:)
   END DO

END PROGRAM test

14楼2014-02-10 02:45:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

引用回帖:
15楼: Originally posted by duhb655 at 2014-02-11 00:09:27
谢谢大神,那么晚还没休息啊!按您的指导我分别存在了A和B,那么能把A,B分别按他们的类型一起写到一个文件里吗?我试了一下,错的啊,有一半对的,一半会有*******号;...

把写文件的代码贴出来……

******的这个,多半是位置不够用
16楼2014-02-11 00:16:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

引用回帖:
17楼: Originally posted by duhb655 at 2014-02-11 00:48:43
program test
implicit none
integer  :: a(11,2),i
real     :: b(11,2)

open(1,file='Result.txt')
do i=1,11
read(1,*) a(i,,b(i,
enddo
open(2,file='zre.txt')
print*,a(:,1)
write(2," ...

你这个程序运行的时候没有报错?好奇怪……虽然 gfortran 编译没有问题,但运行会报错

Fortran runtime error: Expected REAL for item 3 in formatted transfer, got INTEGER

你最后那个 write 语句是不对的。那句话的意思是先输出 a,再输出 b,所以……
18楼2014-02-11 01:23:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

引用回帖:
19楼: Originally posted by duhb655 at 2014-02-11 21:51:04
刚从家里回到学校,没有报错哈,嘿嘿。那我想得到的那种结果的WRITE应该怎么写啊?...

你的啥编译器啊?
就是我前面写的那种循环就可以啊,写到终端和写到文件是一样的啊……
22楼2014-02-12 00:03:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 duhb655 的主题更新
信息提示
请填处理意见