首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fortran 90如何写出不同长度的输出行

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

Stack Overflow用户
提问于 2013-11-07 00:38:37
回答 1查看 9.2K关注 0票数 3

我花了几个小时在互联网上寻找解决这个问题的方法,却什么也找不到。我一直在尝试将未格式化的输出写入一个CSV输出文件,该文件具有多个非常长的不同长度和多个数据类型的行。我首先尝试写一个长标题,它指示下面将用逗号分隔的变量。然后,在下面的行中,我将写入标头中指定的值。但是,通过顺序访问,长输出行被分成多个较短的行,这不是我所希望的。我试着在open语句中使用recl控制行长,但是在输出之后只添加了一串混乱的文本和符号,同样的问题仍在发生。我也尝试使用直接访问,但线路不是相同的长度,所以这也不能工作。我读过关于在Fortran2003中使用流i/o的文章,但是我使用的是Fortran90,所以这也是行不通的。我使用Fortran 90与使用FTN95编译器的柏拉图IDE。我使用数组和一些虚拟文本提供了一个类似于下面所要做的示例程序,我还包括了下面的输出,说明了这个问题。有人知道我怎么能每条写语句只写一行吗?任何帮助都将不胜感激。

代码语言:javascript
复制
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):

代码语言:javascript
复制
 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
EN

回答 1

Stack Overflow用户

发布于 2013-11-07 01:58:02

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

请注意,您没有执行未格式化的输出。格式化与未格式化的问题是输出是否打算是人类可读的问题。

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

有了列表定向格式的输出,处理器可以在项目之间插入它认为合适的尽可能多的记录。它在这里这样做是相当合理的,以便让人们更容易地阅读文件。

如果您希望更多地控制输出的外观,请使用显式格式。例如,类似于:

代码语言:javascript
复制
write(unitout2,"(9999(G12.5,:,','))") bigArray

也许更合适。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19825824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档