gpt4 book ai didi

Fortran 90 如何编写不同长度的超长输出行

转载 作者:行者123 更新时间:2023-12-01 10:51:14 25 4
gpt4 key购买 nike

我花了几个小时在互联网上搜索这个问题的解决方案,但找不到任何东西。我一直在尝试将未格式化的输出写入 CSV 输出文件,该文件包含多行不同长度和多种数据类型的非常长的行。我试图首先写一个长标题,指示将在下面写入的变量,用逗号分隔。然后在下面的行中,我正在写标题中指定的值。然而,通过顺序访问,长输出行被分成多个较短的行,这不是我所希望的。我尝试在 open 语句中使用 recl 来控制行长,但是那只是在输出后添加了一堆乱码文本和符号,仍然出现同样的问题。我也尝试过使用直接访问,但行的长度不一样,所以这也行不通。我读过有关在 Fortran2003 中使用流 i/o 的信息,但我使用的是 Fortran90,所以这也行不通。我在使用 FTN95 编译器的 Plato IDE 中使用 Fortran 90。我在下面包含了一个类似于我想要执行的示例程序,使用数组和一些虚拟文本,并且我在下面包含了说明问题的输出。任何人都知道我怎么能每条写语句只写一行?任何帮助将不胜感激。

module types
integer, parameter :: dp=selected_real_kind(15)
end module types

program blah
use types
use inputoutput

implicit none

integer :: i
character(50)::fileNm
integer :: unitout2=20
real(dp), dimension(100) :: bigArray

fileNm='predictout2.csv'
open(unit=unitout2,file=fileNm,status="replace")

do i=1,100
bigArray(i)=i
end do

write(unitout2,*)"word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,&
&word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,&
&word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word"
write(unitout2,*)bigArray

close(unitout2)

end program

这是上面程序的输出(没有 recl):

 word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word
,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,wo
rd,word,word,word,word,word
1.00000000000 2.00000000000 3.00000000000 4.00000000000
5.00000000000 6.00000000000 7.00000000000 8.00000000000
9.00000000000 10.0000000000 11.0000000000 12.0000000000
13.0000000000 14.0000000000 15.0000000000 16.0000000000
17.0000000000 18.0000000000 19.0000000000 20.0000000000
21.0000000000 22.0000000000 23.0000000000 24.0000000000
25.0000000000 26.0000000000 27.0000000000 28.0000000000
29.0000000000 30.0000000000 31.0000000000 32.0000000000
33.0000000000 34.0000000000 35.0000000000 36.0000000000
37.0000000000 38.0000000000 39.0000000000 40.0000000000
41.0000000000 42.0000000000 43.0000000000 44.0000000000
45.0000000000 46.0000000000 47.0000000000 48.0000000000
49.0000000000 50.0000000000 51.0000000000 52.0000000000
53.0000000000 54.0000000000 55.0000000000 56.0000000000
57.0000000000 58.0000000000 59.0000000000 60.0000000000
61.0000000000 62.0000000000 63.0000000000 64.0000000000
65.0000000000 66.0000000000 67.0000000000 68.0000000000
69.0000000000 70.0000000000 71.0000000000 72.0000000000
73.0000000000 74.0000000000 75.0000000000 76.0000000000
77.0000000000 78.0000000000 79.0000000000 80.0000000000
81.0000000000 82.0000000000 83.0000000000 84.0000000000
85.0000000000 86.0000000000 87.0000000000 88.0000000000
89.0000000000 90.0000000000 91.0000000000 92.0000000000
93.0000000000 94.0000000000 95.0000000000 96.0000000000
97.0000000000 98.0000000000 99.0000000000 100.000000000

最佳答案

这不是用于文件(流、顺序或直接)的 ACCESS 的问题 - 这是您使用的格式规范的结果。

请注意,您不是在进行无格式输出。格式化与未格式化的问题在于输出是否旨在供人类阅读。

WRITE 语句第二个说明符中的星号是列表定向格式的说明。这意味着用于输出的格式基于要输出的事物列表。除此之外,还有一小组用于列表定向输出的语言规则,您几乎将事物的外观留给了 Fortran 处理器(编译器)。

对于列表定向格式化输出,特别允许处理器在项目之间插入它认为合适的尽可能多的记录。它在这里非常合理地这样做,是为了让人们更容易阅读该文件。

如果您想更好地控制输出的外观,请使用显式格式。例如,像这样的东西:

write(unitout2,"(9999(G12.5,:,','))") bigArray

可能更合适。

(从技术上讲,当打开顺序文件时,不应超过处理器定义的最大记录长度(在没有程序员指定最大长度的情况下)。实际上,考虑到顺序格式文件在磁盘上的存储方式几乎所有当前的 Fortran 编译器,这种技术性不会造成任何问题。)

关于Fortran 90 如何编写不同长度的超长输出行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19825824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com