2012-03-04 51 views
0

我有數據填充這樣一個數據文件得到錯誤在讀取數據

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 

我想這個數據存儲在(10,10) 矩陣,這是我的計劃

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當然是正確的,但通常它是C程序員攜帶不適當語言習語的標誌。 – 2012-03-04 18:58:16

回答

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

謝謝..我可以訪問這些值作爲整數..例如,如果我想在文本中乘以2(3,33)那麼應該是什麼命令 – user991852 2012-03-05 18:21:43

+0

這是正確的文本(3,33)* 2 – user991852 2012-03-05 18:22:16

+0

抱歉。 (3,33)替換文字(3,3) – user991852 2012-03-05 18:25:46

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) 

編輯:改變代碼39x39大小的數組,而不是10×10閱讀。

+0

實際上我有.dat文件,它包含39個39個矩陣元素..因此我無法將其複製到.csv文件中。請編寫代碼如何讀取和訪問這些數據在fortran程序中 – user991852 2012-03-05 18:35:28

+1

@ user991852如果數據存儲就像你在問題中說的那樣,代碼應該可以工作,你只需要將循環長度和數組大小改爲39. Fortran中的列表控制輸入(read語句中的* )適用於空格和逗號分隔的值。 – bananafish 2012-03-05 20:29:56

+0

謝謝..很多..我明白了 – user991852 2012-03-06 03:59:17