主题:[讨论]请教输出到文件的问题
hrhktkbzyy
[专家分:10] 发布于 2011-11-17 15:58:00
有两个一维数组,我想实现首先将第一个数组写到文件中的一列,然后第二个数组写在第一列的右边。
现在的问题是,按列写完第一个数组,这时候再写默认是接着第一列的最后的,如果使用REWIND函数,又会在写第二列后将第一列覆盖。不知道有什么方法实现我的需求。
谢谢。
回复列表 (共8个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2011-11-17 16:48:00
你两个同时输出不行么?干嘛非得一个一个的输出呢?
板凳
臭石头雪球 [专家分:23030] 发布于 2011-11-17 16:50:00
可以考虑的办法有:
1.等你两个数组都得到结果以后一起输出。
Do i = 1, N行
write(12,*) a(i) , b(i)
End Do
2.先把 a 数组写到临时文件里。等 b 数组有了数据结果以后。
Do i = 1 , N行
Read(临时文件,*) rTemp
Write(最终文件,*) rTemp , b(i)
End Do
3 楼
cgl_lgs [专家分:21040] 发布于 2011-11-17 18:26:00
分开写效率肯定会降低不少,不过如果楼主使用二进制文件的话就基本没有效率问题了:)
4 楼
hrhktkbzyy [专家分:10] 发布于 2011-11-17 18:48:00
明白你说的意思。我这里说两个数组是打个比方。实际中是:一个数组,计算一次被更新,写入文件;又一个循环,这个数组被更新,再写入一次。如果反复几次,声明几个数组,浪费内存。
其实我本以为有现成的库函数能简单实现这个功能,看了两位高手的回复,应该是没这样的现成函数。
不过臭石头雪球的第二个方法可行,当数据量大时可以节约内存。
5 楼
hrhktkbzyy [专家分:10] 发布于 2011-11-17 18:50:00
嗯,第二种方法适合我的需求。谢谢!
6 楼
cgl_lgs [专家分:21040] 发布于 2011-11-17 21:04:00
楼主能确定要输出几轮么?
如果确定需要输出N轮可以这样:
第一轮输出用:
WRITE(REC=i*n+1)a(i)
第二轮输出用:
WRITE(REC=i*n+2)a(i)
……
第K轮输出用:
WRITE(REC=i*n+K)a(i)
当然上面这些都是伪代码:)你需要做一定的调整才能使用:)
7 楼
hrhktkbzyy [专家分:10] 发布于 2011-11-18 11:15:00
想请教,REC只能用于直接存取文件么?REC代表每次写入的宽度,是不是必须和OPEN中RECL的长度保持一致?
这个用法我测试没成功,主要是不熟悉REC的意义,能否详解一下?谢谢!
8 楼
cgl_lgs [专家分:21040] 发布于 2011-11-18 13:57:00
REC是代表第几个记录,RECL是每个记录的长度。
也不一定非得是直接存取的,FORMATTED也是可以的,但要记得在最后一轮时输出一个换行符,否则你的文件将没法儿看:)
我来回复