各行が整数のリストである Fortran プログラムでデータ ファイルを読みたいと思います。
各行には、指定された文字 (スペース、コンマなど) で区切られた可変数の整数があります。
サンプル入力:
1,7,3,2
2,8
12,44,13,11
行を分割するための解決策がありますが、これはかなり複雑です。
module split
implicit none
contains
function string_to_integers(str, sep) result(a)
integer, allocatable :: a(:)
integer :: i, j, k, n, m, p, r
character(*) :: str
character :: sep, c
character(:), allocatable :: tmp
!First pass: find number of items (m), and maximum length of an item (r)
n = len_trim(str)
m = 1
j = 0
r = 0
do i = 1, n
if(str(i:i) == sep) then
m = m + 1
r = max(r, j)
j = 0
else
j = j + 1
end if
end do
r = max(r, j)
allocate(a(m))
allocate(character(r) :: tmp)
!Second pass: copy each item into temporary string (tmp),
!read an integer from tmp, and write this integer in the output array (a)
tmp(1:r) = " "
j = 0
k = 0
do i = 1, n
c = str(i:i)
if(c == sep) then
k = k + 1
read(tmp, *) p
a(k) = p
tmp(1:r) = " "
j = 0
else
j = j + 1
tmp(j:j) = c
end if
end do
k = k + 1
read(tmp, *) p
a(k) = p
deallocate(tmp)
end function
end module
私の質問:
Fortran でこれを行う簡単な方法はありますか? つまり、読み取る値の数が不明な値のリストを読み取ることです。上記のコードはぎこちなく見え、ファイル I/O は Fortran では簡単ではありません。
また、メイン プログラムは、不明で無制限の長さの行を読み取る必要があります。行がすべて同じ長さであると仮定すると、行を読み取ることができますが (以下を参照)、無制限の行を読み取る方法がわかりません。Fortran 2003 のストリーム機能が必要になると思いますが、書き方がわかりません。
現在のプログラムは次のとおりです。
program read_data
use split
implicit none
integer :: q
integer, allocatable :: a(:)
character(80) :: line
open(unit=10, file="input.txt", action="read", status="old", form="formatted")
do
read(10, "(A80)", iostat=q) line
if(q /= 0) exit
if(line(1:1) /= "#") then
a = string_to_integers(line, ",")
print *, ubound(a), a
end if
end do
close(10)
end program
質問に関するコメント: 通常、これは Python で行います。たとえば、行の変換は と同じくらい簡単でa = [int(x) for x in line.split(",")]
、ファイルの読み取りも同様にほとんど簡単な作業です。そして、Fortran DLL を使用して「実際の」コンピューティングを行います。ただし、ファイル I/O に関する Fortran のスキルを向上させたいと考えています。