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?
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. –
I przegłosowano wyjaśnienie, dlaczego zrobił to, co zrobił, gdy nie działało. Więcej powtórzeń, sir! =) –
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. –