主题:Fortran 选择读写文件格式问题
lalucky
[专家分:0] 发布于 2010-12-19 17:17:00
Fortran 读写文件问题
open(1,file='1.dat')
写文本文件 write(1,*)变量值
写二进制文件 write(1)变量值
我想写一个通过语句 来读写文件 伪代码如下:
if 存为文本
str=‘,*’
else 存为二进制
str=‘’
end if
open(1,file='1.dat')
write(1&str)
有没有办法办到 不要告诉我采用下面的方法 因为数据量大 写一次数据就要判断一次 容易拖慢程序速度
if 存为文本
write(1,*)
else 存为二进制
write(1)
end if
有fortran的高手么?
回复列表 (共17个回复)
沙发
lalucky [专家分:0] 发布于 2010-12-19 17:23:00
有人给点提示不... 感谢啊 我不想把一大段代码复制到if ... else的else下...
板凳
臭石头雪球 [专家分:23030] 发布于 2010-12-19 18:30:00
很遗憾的告诉你,我认为你不得不把 Open 语句也写在 If 判断语句里。
if 存为文本
Open( 10 ,file = )
write(1,*)
else 存为二进制
Open( 10 ,file = , form = 'unformatted')
write(1)
end if
3 楼
臭石头雪球 [专家分:23030] 发布于 2010-12-19 18:35:00
另外,我不认为你可以把文本数据和二进制文件写在同一个文件里。
因为文本数据的长度是不好确定的。
1.1 是3个字节
1.08 是 4个字节
而二进制,单精度就是4字节,双精度就是8字节。
如果二进制文件中加入部分文本数据,那么除非他们的字节数固定。
4 楼
臭石头雪球 [专家分:23030] 发布于 2010-12-19 18:39:00
不过也不是完全无法实现。
可以这样,假设你的数据都是 4字节。
real rD
character(Len=4) cD
EQUIVALENCE( rD , cD )
Open( 10 , file = , form = 'unformatted' ,access =' direct' , recl = 4 ) !// 4字节的记录长度
if 存为文本
write( cD , '(f4.1)' ) 变量
else 二进制
rD = 变量
end if
write( 10 , rec = i ) cD
5 楼
lalucky [专家分:0] 发布于 2010-12-19 19:21:00
悲剧啊..
我本来想写成这样的(is_bin=0文本 is_bin=1二进制)
if is_bin=0
open(1,file='')
str=',*'
else
open(1,file='',form='binary')
str=''
end if
下面接着大段代码:
....
write(1 & str) 变量
.....
如果按照您三楼的方法 只能写成下面的
if is_bin=0
open(1,file='')
....
write(1,*) 变量
.....
else
open(1,file='',form='binary')
....
write(1) 变量
.....
end if
除了write其他代码重复了两次 很臃肿... =.=
我只想选择存为一种格式哦 不是一个文件存两种格式.. 呵呵 高人 你再看看有没有办法? 谢谢你的提示
6 楼
lalucky [专家分:0] 发布于 2010-12-19 19:28:00
如果fortran有像Matlab中eval函数就好了
eval()函数的功能就是将括号内的字符串视为语句并运行 比如 eval('y1=sin(2)')和语句y1=sin(2)等价
7 楼
臭石头雪球 [专家分:23030] 发布于 2010-12-20 09:12:00
我说过了,你没有仔细看。
如果一个文件既有文本部分,又有二进制部分。那么它就是二进制文件!!
我不知道你写过二进制文件没有??
[quote]下面接着大段代码:
....
write(1 & str) 变量
[/quote]
这里的 str 是 format 吗??二进制是无格式的,unformatted!!!
你表述得太模糊了。
你好好看看我 4 楼的代码。我认为可以满足你的需要,除非你表达错了,或者我理解错了。
8 楼
臭石头雪球 [专家分:23030] 发布于 2010-12-20 09:14:00
[quote]如果fortran有像Matlab中eval函数就好了
eval()函数的功能就是将括号内的字符串视为语句并运行 比如 eval('y1=sin(2)')和语句y1=sin(2)等价[/quote]
这是不可能的,Fortran 是编译型语言。如果字符串能视为语句,那就代表着把编译器写入EXE里了。
Matlab 是解释型的,这有本质区别。
如果真的要写代码把字符串转成函数,或许可以写一些简单的自己转换。
9 楼
lalucky [专家分:0] 发布于 2010-12-20 11:36:00
我写过二进制的文件的!!!
我只所以想选择文件类型来保存文件 是为了调试代码的方便...
调试的过程中 我可以将is_bin设置成0 程序产生的文件都是文本格式 我可以直接打开监视 如果所有代码都没有错 再将is_bin设置成1 重新运行 这个时候不用关心文件的内容
这样可以提高计算速度和减小存储空间...
这样应该表述清楚了吧... 我的文件要么是文本 要么是binary 这个是我的动机。。 =.= 我没有必要对一个文件一会存文本一会存binary...
10 楼
lalucky [专家分:0] 发布于 2010-12-20 11:37:00
如果真的要写代码把字符串转成函数,或许可以写一些简单的自己转换。[/quote]
呵呵 这个说到点子上去了 就是这个不会...
我来回复