我想逐行将包含大量数据的矩阵写入文件。例如,我有一个矩阵100 * 100,我希望在文件中以100 * 100的形式。但是,它不起作用。以下是我的代码和一些描述。 N和M是几百个左右的整数。 RECL是预期的长度我设置文件,但在这里似乎这个命令不起作用。当N设置为99时,输出为198行 并且M设置为200. Vec是双精度复数矩阵。我怎么能输出Vec的值保持其原始格式N * M?我的编译命令是“ifort -o out test.f90”。
open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace",RECL=40*M+10)
do i=1,N
do j=1,M
write(2, '(F)', advance='no') real(Vec(i,j))
end do
write(2, *) ''
end do
按照@george的建议,我编写了一个这样的程序:
program test
implicit none
integer i,j
open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace")
do i=1,500
write(2, '(1600F14.7)')( 0.00001 ,j=1,499)
end do
close(2)
end
使用此代码,问题解决了!也许我上次没有正确编译。
答案 0 :(得分:5)
扩展我的评论,你还应该使用一个隐式循环..这个:
open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace")
do i=1,N
write(2, '(1000F14.7)')( real(Vec(i,j)) ,j=1,M)
end do
或者对于足够现代的编译器(我不确定它有多新......)
write(2, '(*(F14.7))')( real(Vec(i,j)) ,j=1,M)
注意,已经指出,2008年标准中(F14.7)
无限格式项目需要*
左右的括号。
也可以提取其他评论,你也可以这样做:
write(2, '(*(F14.7))')real(Vec(i,:M))
答案 1 :(得分:2)
ifort
使用默认记录长度80
。除此之外的一切都放在下一行。您可以通过发出export FORT_FMT_RECL=250
在运行时对其进行扩展,扩展到250个字符。 (当然,你需要调整这个数字)。
但我的猜测是你的写声明的格式说明符。您是否尝试逐行而不是按元素编写矩阵?然后你可以直接指定元素的数量(而不是使用advance='no'
)。
This post也可能有帮助!
编辑: 逐行编写可以像这样实现:
open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace")
do i=1,N
write(2,*) real( Vec(i,:) )
end do
close(2)