2013-04-08 9 views
8

Bir Fortran programında belleğe bir dosya okumaya çalışıyorum. Dosya, her satırda iki değere sahip N satır içerir. Bu şu anda (bu derlenmiş ve çalışan, ancak bana yanlış çıkış verir) ne olduğunu:Fortran dosyaya dizgi okuma - dönüştürülmüş boyutlar

Veri ikinci olarak ilk endeks ve sütunlar gibi hatları ile, değişken cs içine yüklendi olsun ümit Ne
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 

, Ancak yukarıdaki kod çalıştığında, önce iki "sol sütun" değeri olan bir satır, daha sonra iki "sağ sütun" değeri olan bir satır, ardından sonraki iki "sol sütun değeri" olan bir çizgi basar ve böyle devam eder. İşte

durumun daha görsel açıklaması aşağıda verilmiştir: Ben cs tahsis ederken endeks anahtarlama denedim

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 

ancak aynı sonuçları (veya segfault ile Hava bağlı Ayrıca baskı at indeksleri geçiş Beyan). Ayrıca, satır-satır-değerlerini okumayı denedim, ancak veri dosyasının düzensiz formatı nedeniyle (virgülle ayrılmış, sütun-hizalanmış değil), bunu hiç işe yaramadı.

Verileri, istediğim sonucu elde etmenin en iyi yolunu nasıl bellekte okuyabilirim?

cevap

9

Veri dosyanızda hiç virgül göremiyorum. Yine de liste yönelimli girdi ile herhangi bir fark yaratmamalı. Sadece yazdığın gibi okumayı dene. Eğer tek bir komut içinde tüm dizi okumak

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

Aksi takdirde, bu dizi bellekte saklanır sıradır, yani, Sütun büyük sırayla okur cs(1,1), cs(2, 1), ....cs(N,1), cs(1, 2), cs(2,2), ....

+0

Bu işe daha önce neden ulaşamadığımı çok şaşırdım, ama şimdi öyle. Teşekkürler! Giriş dosyamdaki virgüllerle ilgili olarak, bunlar gerçek dosyada var, ancak örnekte sadece elemanların sıralamasını görselleştirmek istedim. –

+0

Ve çalışmadığında ne yaptığını açıklayan açıklama için bir not. Size daha fazla yetkili efendim! =) –

+1

Bu yazının gelecekteki okuyucuları için: Okumak için sadece dosya adını ve satır ve cols sayısını okuyan ve aşağıdaki örtük yapıyla sona eren bir altprogramı genelleştirmek istedim: 'read (f, *) ((cs (satır, sütun), col = 1, Ncols), satır = 1, Burun). Yukarıdaki yanıtta @Vladimir F tarafından belirtilen nedenlerden dolayı sütunların iç döngüde olması gerektiğini unutmayın. –