簡體   English   中英

在fortran 90中打開並讀取一行中的數據

[英]Open and read data in one row in fortran 90

我做了一些偽代碼來學習如何打開和讀取文件。 假設我有以下test.dat,內容為

1
2
3
4
5
6
7
8
9
10

我寫了下面的代碼來打開和讀取數據文件

subroutine readdata
implicit none

integer             :: j
double precision    :: test

open(unit = 100, file = 'test.dat', status = 'old', action = 'read')
 do j = 1,  10
 read(100,*) test
 print *, 'N1=', test
end do

end subroutine

輸出如下所示,如預期

 gfortran -g  -I/usr/include -o main main.o subroutines.o -L/usr/lib64/liblapack -L/usr/lib64/libblas
 test=   1.0000000000000000     
 test=   2.0000000000000000     
 test=   3.0000000000000000     
 test=   4.0000000000000000     
 test=   5.0000000000000000     
 test=   6.0000000000000000     
 test=   7.0000000000000000     
 test=   8.0000000000000000     
 test=   9.0000000000000000     
 test=   10.000000000000000     
 Main finished.

但是,如果數據按如下方式存儲在單行中

1 2 3 4 5 6 7 8 9 10

則以上代碼將無法正常運行。 它僅讀取行中的第一個元素,然后提示錯誤

sharwani@linux-h6qd:~/PHD_research/myCodes/data> ./runcase.sh
rm -f *.o *.mod *.MOD *.exe *.stackdump main
gfortran -g  -I/usr/include -c main.f90
gfortran -g  -I/usr/include -c subroutines.f90
gfortran -g  -I/usr/include -o main main.o subroutines.o -L/usr/lib64/liblapack -L/usr/lib64/libblas
test=   1.0000000000000000    
At line 9 of file subroutines.f90 (unit = 100, file = 'test.dat')
Fortran runtime error: End of file

因此,我的問題是我有一個數據文件,其中包含2879(1 x 2879)個數字,存儲在一行中。 我將如何打開並讀取數據文件中的所有這些數字?

默認情況下,每個Fortran read語句都會讀取值列表,然后前進到下一行的開頭。 read視為在工作時在輸入文件中移動光標。 所以你的陳述

read(100,*) test

當輸入文件中的數字位於單獨的行上時,您會執行什么操作。 當它們都在文件的同一行上時,第一個read語句讀取一個值(即test ),然后前進到下一行的開頭以讀取下一個值,但是沒有下一行,則您會遇到運行時錯誤你給我們看了。

有2個簡單的解決方案。

一種,您可以在一條語句中從一行中讀取多個值,例如,您可以聲明

real, dimension(10) :: test

然后

read(100,*) test

應該一次性將所有值放入數組。

其次,可以使用non-advancing輸入,它告訴處理器不要在每個read語句之后跳到下一行的開頭。 類似於以下內容(請根據情況檢查編輯描述符)

read(100,'(f8.2)',advance='no') test

如果您選擇后一種方法,請不要忘記從一行中讀取所有值之后,您確實希望跳到下一行的開頭,因此您可能需要執行如下語句:

read(100,*)

它不會讀取任何值,但會前進到下一行。

如前所述,您可以通過添加來連續讀取數據

advance='no'

和正確的格式字符串(取決於您的數據;例如,“ i2”適用於諸如[1 2 3 4 5 6]的數據表)用於您的讀取命令。 另一個有用的技巧是通過在參數(即io)上寫入I / O的值並退出do循環而不會出現運行時錯誤,從而照顧I / O狀態,即使您不知道數據表的長度也是如此。 例如,完整的程序可能如下所示:

program read
integer::a,io

open(100, file='data')
do
read(100,'(i2)',advance='no',IOSTAT=io)a
if (io<0) exit
if (io>0) stop 'problem reading'
write(*,*)a
end do

end program

玩得開心!

暫無
暫無

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

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