9

Fortran プログラムでファイルをメモリに読み込もうとしています。ファイルにはN、各行に 2 つの値を持つ行があります。これは私が現在行っていることです(コンパイルして実行しますが、間違った出力が得られます):

program readfromfile
  implicit none

    integer :: N, i, lines_in_file
    real*8, allocatable :: cs(:,:)

    N = lines_in_file('datafile.txt') ! a function I wrote, which works correctly

    allocate(cs(N,2))

    open(15, 'datafile.txt', status='old')
    read(15,*) cs

    do i=1,N
        print *, cs(i,1), cs(i,2)
    enddo

end

私が取得したかったのは、変数csにロードされたデータで、行が最初のインデックス、列が 2 番目でしたが、上記のコードを実行すると、最初に 2 つの「左列」の値を持つ行が出力され、次に 2 つの "右側の列」の値、次に次の 2 つの「左側の列の値」を含む行など。

状況をより視覚的に説明すると、次のようになります。

In my data file:       Desired output:        Actual output:
A1   B1                A1   B1                A1   A2
A2   B2                A2   B2                B1   B2
A3   B3                A3   B3                A3   A4
A4   B4                A4   B4                B3   B4

を割り当てるときにインデックスを切り替えようとしましcsたが、結果は同じです (または、print ステートメントでインデックスを切り替えるかどうかに応じて segfault になります)。また、値を行ごとに読み取ろうとしましたが、データファイルの形式が不規則であるため (列揃えではなくカンマ区切り)、これをまったく機能させることができませんでした。

必要な結果を達成するための最良の方法でデータをメモリに読み込むにはどうすればよいですか?

4

1 に答える 1

11

データ ファイルにカンマがありません。とにかく、リスト指向の入力と何の違いもありません。書くように読んでみてください。

do i=1,N
    read (*,*) cs(i,1), cs(i,2)
enddo

それ以外の場合、1 つのコマンドで配列全体を読み取る場合、列優先順で読み取ります。つまり、cs(1,1), cs(2, 1), ....cs(N,1), cs(1, 2), cs(2,2), ...これは、配列がメモリに格納される順序です。

于 2013-04-08T15:16:17.387 に答える