Fortran Coder

查看: 16024|回复: 9
打印 上一主题 下一主题

[流程控制] 求助&讨论:read的隐式循环转换成do循环就出错

[复制链接]

11

帖子

2

主题

0

精华

入门

绿手

F 币
83 元
贡献
48 点
跳转到指定楼层
楼主
发表于 2016-6-14 17:46:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
2F 币
本帖最后由 一声叹息010 于 2016-6-14 17:51 编辑

主要问题就是:
read(11,"(5a10)") ((x(i,j),y(i,j),z(i,j),j=1,4),i=1,6)
将其写成两个do循环就出错,
两种循环的详细的区别原因是什么?如果必须要用do循环形式,有没有应对的办法?

由于我不会论坛的贴代码功能,为了看的直观,我贴出各个文件的截图,对应的文件也都上传至附件。

输入文件in.txt

正确的输出结果out1(2).txt

用Simply Fortran得到的奇奇怪怪的结果out1.txt

隐式循环形式的test1.f90

do循环形式的test2.f90


1、在win32位系统中,用SF编译执行test1.f90,会得到奇奇怪怪的结果out1.txt
2、在linux系统中,用gfortran编译执行test1.f90,会得到正确的结果out1(2).txt
3、编译执行test2.f90,执行时一定会出错,也不会有结果输出。因为此时只有in.txt的每一行的第一个数据会被读取到。当循环还没有结束时,文件已经结尾了。


sf.JPG (27.79 KB, 下载次数: 554)

sf版本

sf版本

in.txt

753 Bytes, 下载次数: 2

输入文件

out1(2).txt

888 Bytes, 下载次数: 2

正确的输出结果

out1.txt

912 Bytes, 下载次数: 0

错误的输出结果

test1.f90

498 Bytes, 下载次数: 0

隐式循环

test2.f90

522 Bytes, 下载次数: 0

do循环

最佳答案

查看完整内容

1、使用advance='no'不会换行,但是你的数据又分布在多行,读取时依然会报错。 2、具体针对你的问题,没法用你的循环去读取,即使是使用 advance。如果非要去做,也可以,费力不讨好。 3、用隐循环最安全。 4、使用3维数组最省劲儿。[mw_shl_code=fortran,true]program test character(10) a(3,4,6) open(10,file='in.txt') read(10,*) a close(10) k=0 do i=1,6 do j=1,4 k=k+1 write(*,"(i3,2x,3a10)") k,a(:,j,i) end do end ...
分享到:  微信微信
收藏收藏1 点赞点赞 点踩点踩

796

帖子

2

主题

0

精华

大宗师

F 币
3787 元
贡献
2266 点
沙发
发表于 2016-6-14 17:46:18 | 只看该作者
1、使用advance='no'不会换行,但是你的数据又分布在多行,读取时依然会报错。
2、具体针对你的问题,没法用你的循环去读取,即使是使用 advance。如果非要去做,也可以,费力不讨好。
3、用隐循环最安全。
4、使用3维数组最省劲儿。
[Fortran] 纯文本查看 复制代码
program test 
character(10) a(3,4,6)
open(10,file='in.txt')
read(10,*) a 
close(10)
k=0
do i=1,6
do j=1,4
k=k+1
write(*,"(i3,2x,3a10)") k,a(:,j,i)
end do 
end do
end 

QQ截图20160616160446.jpg (43.39 KB, 下载次数: 493)

QQ截图20160616160446.jpg

评分

参与人数 2F 币 +22 贡献 +22 收起 理由
fcode + 12 + 12 很给力!李老师辛苦了
一声叹息010 + 10 + 10 很给力!

查看全部评分

回复

使用道具 举报

11

帖子

2

主题

0

精华

入门

绿手

F 币
83 元
贡献
48 点
板凳
 楼主| 发表于 2016-6-14 18:17:19 | 只看该作者
对于最后的问题1,是字符编码造成的。
如果使用dos utf-8编码的in.txt,gfortran和sf都会得到一样的奇奇怪怪的输出结果out1(2).txt。
如果使用unix文件编码格式,gfortran和sf都能得到正确的输出结果out1.txt
但是,为什么只有前两行出错了,后面的输出都很对啊?!
回复

使用道具 举报

11

帖子

2

主题

0

精华

入门

绿手

F 币
83 元
贡献
48 点
地板
 楼主| 发表于 2016-6-14 18:31:37 | 只看该作者
一声叹息010 发表于 2016-6-14 18:17
对于最后的问题1,是字符编码造成的。
如果使用dos utf-8编码的in.txt,gfortran和sf都会得到一样的奇奇怪 ...

找到真正的原因了,原来in.txt的第一行开头,有个被称作BOM(Byte Order Mark)的不可见字符,删掉以后就一切都变得正常了。


回复

使用道具 举报

11

帖子

2

主题

0

精华

入门

绿手

F 币
83 元
贡献
48 点
5#
 楼主| 发表于 2016-6-14 20:02:48 | 只看该作者
问题3,还是没解决
回复

使用道具 举报

796

帖子

2

主题

0

精华

大宗师

F 币
3787 元
贡献
2266 点
6#
发表于 2016-6-15 10:42:48 | 只看该作者
每执行一次read或write, 默认都会换行。显循环执行了24次,而隐循环执行1次。
使用advance使之不换行
read(11,*,ADVANCE='NO') x(i,j), y(i,j),z(i,j)
回复

使用道具 举报

11

帖子

2

主题

0

精华

入门

绿手

F 币
83 元
贡献
48 点
7#
 楼主| 发表于 2016-6-15 11:33:40 | 只看该作者
li913 发表于 2016-6-15 10:42
每执行一次read或write, 默认都会换行。显循环执行了24次,而隐循环执行1次。
使用advance使之不换行
read ...

语法报错
回复

使用道具 举报

796

帖子

2

主题

0

精华

大宗师

F 币
3787 元
贡献
2266 点
8#
发表于 2016-6-15 15:54:18 | 只看该作者
哦,忘了,有了advance就不能用星号,得给定格式。
回复

使用道具 举报

11

帖子

2

主题

0

精华

入门

绿手

F 币
83 元
贡献
48 点
9#
 楼主| 发表于 2016-6-15 17:03:21 | 只看该作者
li913 发表于 2016-6-15 15:54
哦,忘了,有了advance就不能用星号,得给定格式。

能麻烦你跑一遍程序吗。加了格式控制,就又回到错误的循环模式了
回复

使用道具 举报

11

帖子

2

主题

0

精华

入门

绿手

F 币
83 元
贡献
48 点
10#
 楼主| 发表于 2016-6-16 18:06:26 | 只看该作者
li913 发表于 2016-6-16 16:05
1、使用advance='no'不会换行,但是你的数据又分布在多行,读取时依然会报错。
2、具体针对你的问题,没法 ...

受小弟一拜!
简洁而高效。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 13:58

Powered by Tencent X3.4

© 2013-2024 Tencent

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