2012-03-04 8 views
0

私は(10,10)のマトリックス中に、このデータを保存したいデータがが、これは私のプログラムでデータの読み取り中にエラー

1 2 3 4 5 6 7 8 9 10 
11 12 13 14 15 16 17 18 19 20 
    . 
    . 

    . 

    . 
    . 
91 92 93 94 95 96 97 98 99 100 

このように充填されている1つのデータファイルを持っている 取得

program test 
integer j,n,m 
character,dimension(10,10) ::text 
character*50 line 
open(unit=3,file="tmp.txt",status='old') 
n=1 
read(3,"(a50)"),line 

read(line,*,end=1),(text(1,i),i=1,10) 
1 read(3,"(a50)",end=3),line 
n=n+1 
read(line,*,end=1)(text(n,i),i=i,10) 

3 close(3) 

end program test 

ただし、正しい値が得られません。

+2

文字を読み取っているかのように見えます。文字はすべて数字または数字のいずれかになります。あれは正しいですか ?あるいは、整数を読み込み、ある種のバッファーとして文字変数を使用しようとしていますか? Fortranの整数をファイルから読み込む方法ではありません。私はあなたの配列テキストの宣言にも困惑しています。確かに、Fortranは2次元の文字配列を持つことは間違いありませんが、しばしば不適切な言語のイディオムを乗り越えるCプログラマの兆候です。 –

答えて

4

私は最初に文字列に読み込みを行い、次にそれを解析しようとしているとは思わない。スペース区切りの行を文字列に分割するようにFortranに任せてください。また、あなたの文字列だけではなく、文字の何か長文字列の配列になりたいことに注意してください:

program test 
    character(len=3),dimension(10,10) ::text 
    character(len=7), parameter :: filename="tmp.txt" 
    integer :: i,j 
    integer :: nlines 

    open(unit=3,file=filename) 
    do i=1,10 
     write(3,fmt="(10(i3,1x))"), (10*(i-1)+j, j=1,10) 
    enddo 
    close(unit=3) 

    open(unit=4,file=filename,status='old') 

    do i=1,10 
     read(4,*,end=1), (text(i,j),j=1,10) 
    enddo 
1 nlines = i 
    close(unit=4) 

    print *,' Read in character array: ' 
    do i=1,nlines-1 
     print "(10('<',a,'>',1x))", (trim(text(i,j)), j=1,10) 
    enddo 

end program test 

実行これは、格納された数字を持つあなたは満足していると仮定すると、

$ ./test 
    Read in character array: 
<1> <2> <3> <4> <5> <6> <7> <8> <9> <10> 
<11> <12> <13> <14> <15> <16> <17> <18> <19> <20> 
<21> <22> <23> <24> <25> <26> <27> <28> <29> <30> 
<31> <32> <33> <34> <35> <36> <37> <38> <39> <40> 
<41> <42> <43> <44> <45> <46> <47> <48> <49> <50> 
<51> <52> <53> <54> <55> <56> <57> <58> <59> <60> 
<61> <62> <63> <64> <65> <66> <67> <68> <69> <70> 
<71> <72> <73> <74> <75> <76> <77> <78> <79> <80> 
<81> <82> <83> <84> <85> <86> <87> <88> <89> <90> 
<91> <92> <93> <94> <95> <96> <97> <98> <99> <100> 
+0

ありがとう..私は整数としてこれらの値にアクセスすることができます.example私はテキスト(3,33)で2を掛けたい場合、コマンドは何でしょうか – user991852

+0

はこの正しいテキストです(3,33)* 2 – user991852

+0

申し訳ありません..テキスト(3,33)を(3,3) – user991852

5

を与えます整数として、最も簡単な方法は、このようにそれを行うことです。

PROGRAM read_data 

    integer :: i 
    integer :: numbers(39,39) 
    character(10) :: infile = "data.dat" 
    character(10) :: outfile = "output.dat" 

    open(1,file=infile) 
    open(2,file=outfile) 

    do i=1,39 
     read(1,*) numbers(i,1:39) 
    end do 

    !write output to check 
    do i=1,39 
     write(2,'(39I5)') numbers(i,1:39) 
    end do 

    close(1) 
    close(2) 

    END PROGRAM 

Fortranは文字列処理では非常に良いではありませんように私はあらゆる種類の変数を格納するための文字列を使用してお勧めしません。あなたはいくつかの点では、ファイルに書き込むのと同じよう文字列変数に書き込み、文字列としてデータを使用する必要がある場合:

write(my_string,'(I5)') numbers(1,1) 

編集:代わりに10×10の39x39のサイズの配列を読み込むためのコードを変更しました。

+0

実際に私は.datファイルを持っています39の39の要素を含んでいます。それは.csvファイルにコピーすることはできません..コードを書いてくださいどのように私は& Fortranプログラムで – user991852

+1

@ user991852あなたが質問のようにデータが格納されている場合、コードが機能するはずです。ループ長と配列サイズを39に変更するだけです。Fortranのリスト指示型入力(read文の* )は、スペース区切りとコンマ区切りの両方の値に対して機能します。 – bananafish

+0

ありがとう..a lot..i got it – user991852

関連する問題