Fortran read-Datei in array - Dimensionen umgesetzt
Ich versuche zu Lesen, eine Datei in den Speicher, in ein Fortran-Programm. Die Datei hat N
Zeilen mit zwei Werten in jeder Zeile. Dies ist, was ich derzeit tun (es kompiliert und läuft, aber gibt mir falsche Ausgabe):
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
Dem, was ich hoffte, zu erhalten, war die geladenen Daten in die variable cs
, mit Linien, die als ersten index-und Spalten wie die zweite, aber wenn der obige code ausgeführt wurde, es gibt zunächst druckt eine Zeile mit zwei "linken Spalte" Werte, dann eine Zeile mit zwei "rechten Spalte" Werte, dann eine Zeile mit den nächsten zwei "linke Spalte "Werte" und so weiter.
Hier ist eine weitere visuelle Beschreibung der situation:
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
Ich habe versucht, schalten die Indizes bei der Zuteilung von cs
, aber mit dem gleichen Ergebnis (oder segfault, je nachdem ob ich auch wechseln Indizes bei der print-Anweisung). Ich habe auch versucht, das Lesen der Werte Zeile für Zeile, aber wegen der unregelmäßigen format der Daten-Datei (Komma-separierte, nicht-Spalte ausgerichtet werden) konnte ich nicht bekommen, diese arbeiten überhaupt.
Wie lese ich die Daten in den Speicher der beste Weg, um die Ergebnisse erzielen, die ich will?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehe ich nicht ein Komma in Ihren Daten-Datei. Es sollte keinen Unterschied machen mit der Liste der Regie-Eingang sowieso. Versuchen Sie einfach Lesen, so wie Sie es schreiben.
Sonst, wenn Sie Lesen, ganze Arrays in einem Befehl, er liest es in column-major-Reihenfolge, d.h.,
cs(1,1), cs(2, 1), ....cs(N,1), cs(1, 2), cs(2,2), ...
Dies ist die Reihenfolge, in der das array im Speicher abgelegt.read(f, *) ((cs(row,col),col=1,Ncols),row=1,Nrows)
. Beachten Sie, dass die Spalten werden in der inneren Schleife, für die bereits oben genannten Gründen von @Vladimir F in der Antwort oben.