2015-10-13 99 views
0

爲了計算座標之間的距離,我需要從txt文件讀入三個數組。我已經看過其他答案,並將腳本拼湊在一起。輸入文件的列需要分別來到我的x,y和z陣列。每個條目有64行和16位小數位。指針將不勝感激。Fortran從fie讀入數組

數據格式:

0.8607595188703266 0.9252035918116585 0.4094258340665792 
    0.5246038490998378 0.9804633529144733 0.5325820695466118 
    0.6955271184611949 0.3304908806613460 0.7154502550542654 

和我的劇本至今:

PROGRAM readtest 

use, intrinsic :: iso_fortran_env 

implicit none 

integer, parameter :: ArrayLen = 64 
real(real64), DIMENSION(ArrayLen) :: x 
real(real64), DIMENSION(ArrayLen) :: y 
real(real64), DIMENSION(ArrayLen) :: z 
integer :: i, ReadCode, num 



OPEN(1, FILE='contcar.txt', STATUS='old', ACTION='read') 
OPEN(2, FILE='xyz.txt', STATUS='replace', ACTION='write') 

num = 0 
ReadLoop: do i=1, ArrayLen 

    read (1, '(A,F18.16)', iostat=ReadCode) x(i), y(i), z(i) 

    if (ReadCode /= 0) then 
     if (ReadCode == iostat_end) then 
     exit ReadLoop 
     else 
     write (*, '(/ "Error on read: ", I0)') ReadCode 
     stop 
     end if 
    end if 

    num = num + 1 

end do ReadLoop 

WRITE(3, 100) x, y, z 
100 format (A,F18.16) 

END PROGRAM readtest 

的xyz.txt將該被顯示爲空白,我在這個階段沒有得到任何錯誤,什麼是錯在這裏那是停止數組填充和寫入文件? 對不起,如果這太麻煩了,任何幫助將不勝感激。 感謝

+0

你發佈的內容非常有幫助,謝謝你,你回答了我還沒有問的問題。 –

+0

是的,我發現幾分鐘前,並糾正。輸出文件現在已填充,但不完全正確。 –

+0

好點。我認爲如果我明天重新開始這個問題並且解決問題可能是最好的。再次感謝。 –

回答

0

你有兩個問題,你的做法:

  • 你的格式規範是錯誤的
  • 你寫不會做你想做的

首先,格式A,F18.16讀兩個項目,一個字符和一個浮點數。你想要的是讀取3個浮點數。隨着文件規定,有兩個空格每個號碼之前,所以你可以使用

read (1, '(3(2X,F18.16))', iostat=ReadCode) x(i), y(i), z(i) 

但這不是很靈活,如果你的輸入格式的變化,它更容易只是做表式輸入:

read (1, *, iostat=ReadCode) x(i), y(i), z(i) 

它會做你想做的事情,對文件中數字的確切位置以及存在多少介入空間不敏感。

這會將您的數據加載到數組中。現在輸出你想要的東西。你想複製輸出,所以我們可以使用第一種格式來約定輸出(3(2X,F18.16))。這將在每個數字前輸出3個數字,每個數字有2個空格。接下來的問題是你正在嘗試

WRITE(3, 100) x, y, z 

這將轉置你的數組。它會寫出所有的x,然後是所有的y,最後是所有的z。如果你想要相同的輸出,把它放在一個循環中。把以上一起使用:

do i=1, ArrayLen 
    WRITE(2, 100) x(i), y(i), z(i) 
end do 
100 format (3(2X,F18.16)) 

作爲一個說明,不使用單位單元號,特別是最初的幾個,其與上大多數編譯器定義的標準輸入/輸出/錯誤單元系統衝突。