2013-04-08 11 views
8

Próbuję odczytać plik do pamięci w programie Fortran. Plik ma wiersze N z dwiema wartościami w każdym wierszu. To, co obecnie zrobić (kompiluje i działa, ale daje mi nieprawidłowe wyjście):Fortran odczytał plik do tablicy - transponowane wymiary

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 

Co mam nadzieję dostać się dane załadowane do zmiennej cs, liniami jak pierwszego indeksu i kolumny jako drugi, ale gdy powyższy kod działa, najpierw daje wydruk linii z dwiema wartościami "lewej kolumny", następnie linią z dwiema wartościami "prawej kolumny", następnie linią z następnymi dwiema "wartościami z lewej kolumny" i tak dalej.

Oto bardziej wizualny opis sytuacji:

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 

Próbowałem przełączania indeksy przy przydzielaniu cs, ale z tych samych wyników (lub segfault, w zależności od wether ja też przełączyć indeksów na wydruku komunikat). Próbowałem również czytać wartości rząd po rzędzie, ale z powodu nieregularnego formatu pliku danych (rozdzielanego przecinkami, a nie wyrównanego do kolumny), nie mogłem tego w ogóle uruchomić.

Jak odczytać dane w pamięci, aby uzyskać najlepsze rezultaty?

Odpowiedz

9

Nie widzę żadnego przecinka w twoim pliku danych. Nie powinno to jednak czynić żadnej różnicy z wprowadzaniem z listą. Po prostu spróbuj przeczytać to tak, jak to piszesz.

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

W przeciwnym razie, jeśli czytać całą tablicę w jednym poleceniu, odczytuje go w celu kolumnowej-dur, tj cs(1,1), cs(2, 1), ....cs(N,1), cs(1, 2), cs(2,2), ... To jest kolejność, w której tablica jest przechowywana w pamięci.

+0

Jestem zdumiony, dlaczego nie mogłem zrobić tego wcześniej, ale teraz to robi. Dzięki! Jeśli chodzi o przecinki w moim pliku wejściowym, są one w rzeczywistym pliku, ale w tym przykładzie chciałem tylko wizualizować porządkowanie elementów. –

+0

I przegłosowano wyjaśnienie, dlaczego zrobił to, co zrobił, gdy nie działało. Więcej powtórzeń, sir! =) –

+1

Dla przyszłych czytelników tego posta: Chciałem uogólnić odczyt do podprogramu, który po prostu pobiera nazwę pliku oraz liczbę wierszy i cols do przeczytania, a zakończył się następującymi niejawnymi do skonstruowania: 'read (f, *) ((cs (row, col), col = 1, Ncols), row = 1, Nrows) '. Zauważ, że kolumny muszą znajdować się w wewnętrznej pętli, z powodów wymienionych przez @Vladimir F w powyższej odpowiedzi. –