主题: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个回复)
11 楼
臭石头雪球 [专家分:23030] 发布于 2010-12-20 11:50:00
明白了!
之前误解你的意思,是因为你在主楼说
[quote]因为数据量大 写一次数据就要判断一次 容易拖慢程序速度
[/quote]
所以我以为你同一个文件想存为二进制,中间有一部分是文本呢。
如果“写文本文件或是写二进制文件”,这个并不因为循环过程而改变。
而是自始自终都固定的
那么用条件编译是最好的了。
如果不用条件编译,就
if 文本
Open()
Do
write
end do
close
else 二进制
Open( form = binary)
Do
write
end do
close
endif
或者写两个函数 write_to_text 和 write_to_binary
这是最直观的,虽然代码多一些。
但很整齐,也符合类似条件编译的概念。
不要想着用
write(1 & str) 变量
这里的 str 这样的 format 格式符来控制二进制输出。记住,二进制是无格式的。
12 楼
lalucky [专家分:0] 发布于 2010-12-20 12:15:00
[quote]
if 文本
Open()
Do
write
end do
close
else 二进制
Open( form = binary)
Do
write
end do
close
endif
[/quote]
呵呵 只能如此咯 ... 我昨天晚上就是按这个格式改了 没有办法啊 修改代码时有点不方便 改了if里面的还得对应改else里面.. 保持对应才行..
老外写的程序中 如果是存文本
open(1,file=)
write(1,*)变量 或 read(1,*)变量 不带格式
如果是二进制
open(1,file='unformatted') 或者open(1,file='binary')
write(1)变量 或 read(1)变量 也不带格式
我觉得这样很方便..
所以才想能不能用个str=',*' 看样子是不行了..
呵呵 行了 结贴之前 再问个弱问题....
我的主程序编译成
Main_Prog.exe
我弄一个start.bat
内容为
Main_Prog.exe
pause
俺想把控制台的运行结果保存成list.txt
我试了一下 Main_Prog.exe > list.txt 不行 好像和Dos下的情况不太一样
我用的inter fortran + visual studio
石头大哥,有木有法子...
13 楼
lalucky [专家分:0] 发布于 2010-12-20 12:16:00
俺觉得法子 肯定有滴 只是不太熟悉 语法..
呵呵..
要学的东西太多了 顾不过来了...
14 楼
dongyuanxun [专家分:7180] 发布于 2010-12-20 12:21:00
为什么不行
只能说你输出的不是标准输出
不行就用Main_Prog.exe > list.txt 2>&1
你这个问题处理比较好的就是预编译处理方式,但预处理不是标准内容,所以不同编译器处理方式不同,ivf使用/fpp开关开启预编译。
15 楼
lalucky [专家分:0] 发布于 2010-12-20 13:54:00
[quote]为什么不行
只能说你输出的不是标准输出
不行就用Main_Prog.exe > list.txt 2>&1
你这个问题处理比较好的就是预编译处理方式,但预处理不是标准内容,所以不同编译器处理方式不同,ivf使用/fpp开关开启预编译。[/quote]
呵呵 Main_Prog.exe > list.txt 就可以了
问题又来了 这样控制台就不显示程序的进度了 全部保存到list.txt
有没有办法让控制台显示 同时也保存到list.txt
16 楼
dongyuanxun [专家分:7180] 发布于 2010-12-20 14:10:00
[quote][quote]为什么不行
只能说你输出的不是标准输出
不行就用Main_Prog.exe > list.txt 2>&1
你这个问题处理比较好的就是预编译处理方式,但预处理不是标准内容,所以不同编译器处理方式不同,ivf使用/fpp开关开启预编译。[/quote]
呵呵 Main_Prog.exe > list.txt 就可以了
问题又来了 这样控制台就不显示程序的进度了 全部保存到list.txt
有没有办法让控制台显示 同时也保存到list.txt[/quote]
直接没办法 必须使用多线程 一个线程保存文件 一个线程输出进度
17 楼
lalucky [专家分:0] 发布于 2010-12-20 14:25:00
[em54][em54][em54][em54][em54]
我来回复