2016-07-12 5 views
0

Ich habe eine Textdatei zu lesen, die etwa wie folgt aussieht:Befehlszeilenargumente verwenden, um bestimmte Spalte aus der Datendatei in Fortran

  0 0.258 -0.188 -0.446 -0.035 0.351 -0.317 1.361 1.066 1.198 1.115 1.208 0.804 -0.084 -0.643 0.201 
      1 0.265 -0.193 -0.457 -0.036 0.361 -0.325 1.361 1.068 1.197 1.113 1.208 0.803 -0.082 -0.653 0.202 
      2 0.264 -0.190 -0.453 -0.037 0.358 -0.322 1.363 1.070 1.200 1.115 1.212 0.806 -0.080 -0.658 0.201 
      3 0.264 -0.182 -0.446 -0.041 0.354 -0.314 1.363 1.073 1.200 1.113 1.212 0.806 -0.082 -0.659 0.198 
      4 0.257 -0.180 -0.436 -0.038 0.346 -0.308 1.359 1.067 1.198 1.111 1.208 0.802 -0.084 -0.655 0.194 
      5 0.260 -0.176 -0.436 -0.042 0.348 -0.306 1.357 1.065 1.193 1.109 1.204 0.801 -0.083 -0.648 0.193 

ich nur eine bestimmte Spalte lesen möchten, sagen die dritte Spalte von diesem Datei mit einem Befehlszeilenargument (wahrscheinlich getarg). Wenn der Benutzer also nur eine bestimmte Spalte aus der Datendatei lesen möchte, sollte er in der Lage sein, dies als Argument an den Befehl zu übergeben, der die ausführbare Datei ausführt. Jetzt lese ich einfach die ganzen Daten in einem großen mehrdimensionalen Array und verwerfe dann die unerwünschten Spalten. Da die Datei jedoch zu groß ist, verbraucht dies viel Speicher. Danke im Voraus.

+0

Möchten Sie nur diese Spalte in eine Datei schreiben, oder möchten Sie sie in einem Array speichern, oder was beabsichtigen Sie damit zu machen? –

Antwort

2

Eine der möglichen Lösungen besteht darin, die Datendatei Zeile für Zeile zu lesen und die erforderliche Spalte im zugeordneten Array zu speichern. Wenn die Quelldaten zu groß sind, ist es immer besser, temporäre Werte in dynamisch zugewiesenen Variablen zu speichern und den Speicher zurückzugeben (Variablen freizugeben), sobald sie nicht mehr benötigt werden.

Das folgende Beispiel zeigt, wie dies erreicht werden kann. Es liest die Quelldatei und druckt die angegebene Spalte in die Konsole.

program read_columns 

    use, intrinsic :: iso_fortran_env, only: iostat_end 
    implicit none 

    ! array to store one source line 
    real, dimension(16) :: array 

    character(len=16) :: buffer 

    integer unit 
    integer status 
    integer column 

    ! suppose we have only one command line argument 
    if (command_argument_count() >= 1) then 
     call get_command_argument(1, buffer) 
     write (*,*) buffer 
     read (buffer, '(i)') column 
    end if 

    open(newunit = unit, file = 'big_table.txt', status = 'old', action = 'read') 
    do 
     read(unit, *, iostat = status) array 
     if (status == iostat_end) then 
      exit 
     end if 

     if (status > 0) then 
      error stop 'Could not read a file.' 
     end if 

     ! fifth column to print 
     write(*, '(f8.3)') array(column) 
    end do 

    close(unit) 
end 
+0

Der Hauptpunkt ist, dass der Benutzer in der Lage sein sollte, die Nummer der zu lesenden Spalte an die Laufzeit zu übergeben, indem er so etwas wie 'getarg' verwendet. Ich sehe das nicht in deiner Antwort. – Peaceful

+1

@SnehalShekatkar Das ist ein kleines Detail, das Sie sich leicht anhängen können. Dies ist kein Service für die Bereitstellung einer voll funktionsfähigen Software für Sie. Wenn Sie eine solche Antwort unter Ihrer eigenen Frage ablehnen, ist es nur undankbar. –

+0

Danke @VladimirF! In dieser Antwort wollte ich nur zeigen, wie es möglich ist, ein großes Array zu lesen und zu verarbeiten. Nebenbei habe ich einen Block hinzugefügt, der genau eine Befehlszeilenargumente erwartet und liest. – syscreat

Verwandte Themen