簡體   English   中英

Fortran 90 怎么寫很長 output 不同長度的行

[英]Fortran 90 how to write very long output lines of different length

我花了幾個小時在互聯網上尋找解決這個問題的方法,但找不到任何東西。 我一直在嘗試將未格式化的 output 寫入 CSV output 文件,其中包含多個不同長度和多種數據類型的超長行。 我正在嘗試先寫一個長的 header ,它表示將在下面寫入的變量,用逗號分隔。 然后在下面的行中,我正在編寫 header 中指定的值。 然而,通過順序訪問,長的 output 行被分成多個較短的行,這不是我所希望的。 我嘗試在 open 語句中使用 recl 控制行長,但是在 output 之后只添加了一堆亂碼文本和符號,仍然出現同樣的問題。 我也嘗試過使用直接訪問,但線條的長度不同,因此也不起作用。 我已經閱讀了有關在 Fortran2003 中使用 stream i/o 的信息,但我使用的是 Fortran90,所以這也不起作用。 我正在使用 Fortran 90 和 Plato IDE,它使用 FTN95 編譯器。 我在下面包含了一個類似於我想要做的示例程序,使用一個數組和一些虛擬文本,並且我在下面包含了 output 來說明問題。 任何人都知道我如何每條寫語句只寫一行? 任何幫助將不勝感激。

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

這是上述程序的 output(沒有 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

這不是用於文件(流,順序或直接)訪問權限的問題-這是所使用格式規范的結果。

請注意,您未執行未格式化的輸出。 格式化與未格式化是一個問題,即輸出是否旨在人類可讀。

WRITE語句的第二個說明符中的星號是列表定向格式的說明 這意味着用於輸出的格式基於要輸出的事物列表。 除此之外,還有用於列表定向輸出的語言中的一小組規則,您幾乎可以將事情的外觀留給Fortran處理器(編譯器)處理。

使用列表定向格式化輸出,可以特別允許處理器在項目之間插入盡可能多的記錄。 這樣做相當合理,目的是使人們更輕松地閱讀文件。

如果要對輸出的外觀進行更多控制,請使用顯式格式。 例如,類似:

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

可能更合適。

(從技術上講,打開順序文件時,不應超過處理器定義的最大記錄長度(在沒有程序員指定的最大長度的情況下)。實際上,考慮到幾乎所有當前的Fortran在磁盤上存儲順序格式化文件的方式編譯器,這種技術性不會造成任何問題。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM