Lesen einer Zeichenkette unbekannter Länge
Ich wurden beauftragt mit dem schreiben einer Fortran-95-Programm auf das Lesen von Eingabezeichen aus einer Datei, und dann (beginnen mit) einfach spucken es wieder heraus.
Der schwierige Teil ist, dass diese Zeilen von input sind von unterschiedlicher Länge (Länge nicht angegeben) und es kann eine beliebige Anzahl von Zeilen innerhalb der Datei.
Ich verwendet habe,
do
read( 1, *, iostat = IO ) DNA ! reads to EOF -- GOOD!!
if ( IO < 0 ) exit ! if EOF is reached, exit do
I = I + 1
NumRec = I ! used later for total no. of records
allocate( Seq(I) )
Seq(I) = DNA
print*, I, Seq(I)
X = Len_Trim( Seq(I) ) ! length of individual sequence
print*, 'Sequence size: ', X
print*
end do
Jedoch meine anfänglichen Aussagen-Liste
character(100), dimension(:), allocatable :: Seq
character(100) DNA
und die entsprechenden ganzen zahlen etc.
Ich denke, was ich verlange ist, wenn es irgendeinen Weg gibt, um NICHT die Größe der Zeichenketten in der ersten Instanz. Sagen, ich habe einen DNA-Strang, die 200+ Zeichen, und dann noch nur 25, gibt es eine Möglichkeit, dass das Programm nur Lesen können, was da ist und nicht brauchen, um alle zusätzlichen Leerzeichen? Kann das getan werden, ohne die Verwendung len_trim
, da kann es nicht sein, auf die in der Erklärung Aussagen?
- Es gibt einen Unterschied zwischen ein wenig Lesen einer Zeile (in Fortran-Terminologie - ein Rekord), machen einige Verarbeitung auf das bisschen, lese ein bisschen mehr auf der gleichen Linie, - Verarbeitung, bit, usw., im Gegensatz zum Lesen in die komplette Linie und dann machen einige Verarbeitung auf, dass die komplette Zeile (einem Dritten Fall liest die gesamte Datei und dann die Verarbeitung der gesamten Datei). Die erste ist leicht in Fortran 95 - Verwendung des nicht-voran-Eingang. Das zweite ist ... ein wenig chaotisch. Was wollen Sie? Beide sind leicht in Fortran 2003 - muss man sich an F95?
- Leider habe ich nur Zugriff auf f95, wie ich bin mit meinen Vorgesetzten computer/software etc. Natürlich die einfachen ist vorzuziehen, aber vielleicht geben Sie mir beide? Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schrittweisen Lesen eines Datensatzes in Fortran 95, verwenden Sie nicht-voran-Eingang. Zum Beispiel:
Lesen bis zu 10 Zeichen Wert (die Länge von buffer) jedes mal, wenn es aufgerufen wird. Die Datei wird dann weiter zum nächsten record (die nächste Zeile) einmal wird der gesamte Datensatz gelesen wurde, eine Reihe von ein oder mehr nicht-advancing liest.
Abgesehen von einem end of file-Bedingung, die
size
variable definiert, mit der tatsächlichen Anzahl von Zeichen Lesen Sie inbuffer
jedes mal, wenn die read-Anweisung ausgeführt wird.Den
EOR
undEND
- und-Bezeichner werden verwendet, um die Kontrolle ausführungsablauf (execution springen, um die entsprechend gekennzeichnete Anweisung), wenn das Ende der Aufzeichnung oder das Ende der Datei Bedingungen auftreten, beziehungsweise. Sie können auch eineIOSTAT
Bezeichner zu erkennen, diese Bedingungen, sondern insbesondere die negativen Werte für die zwei Bedingungen sind prozessorabhängig.Können Sie die Summe
size
innerhalb eines bestimmten Datensatzes, um die Länge des jeweiligen Datensatzes.Wrap solchen nicht fortschreitenden Lesen Sie in einer Schleife, die entsprechend erkennt zum Ende der Datei und das Ende der Aufzeichnung, und Sie haben die inkrementelle Lesen Teil.
In Fortran 95, die Länge Spezifikation für eine lokale Zeichenvariable muss eine Spezifikation Ausdruck - im wesentlichen ein Ausdruck, der sicher sein kann, bewertet vor der ersten ausführbaren Anweisung des Bereichs, enthält die variable in der Erklärung. Konstanten repräsentieren den einfachsten Fall, aber eine Spezifikation Ausdruck in ein Verfahren einbeziehen können, um dummy-Argumente, die der Prozedur, unter anderem.
Lesen Sie den gesamten Datensatz beliebiger Länge, ist dann ein multi-stage process:
Backspace
die Datei wieder zu dem Datensatz von Interesse.Beachten Sie, dass jeder Datensatz endet als zweimal Lesen - einmal, um zu bestimmen, seine Länge, die zweite, um wirklich zu Lesen, die Daten in die richtige "lengthed" Charakter Variablen.
Alternative Ansätze existieren, die die Verwendung belegbar (oder automatische) Zeichen-arrays der Länge eins. Die Allgemeine Strategie ist die gleiche. Blick auf die code von der Get-Verfahren in den gemeinsamen ISO_VARYING_STRING Umsetzung für ein Beispiel.
Fortran 2003 führt latenten Länge von character Variablen, die von Ihrer Länge angegeben, die durch einen beliebigen Ausdruck in einer allocate-Anweisung oder für belegbar Variablen, die durch die Länge der rechten Seite einer Zuweisungsanweisung. Dies (in Verbindung mit anderen "belegbar" - Erweiterungen) ermöglicht es, den progressiven Lesen, die bestimmt die Länge der Aufzeichnung zu bauen auch das character-variable, enthält den Inhalt des Datensatzes. Ihr Vorgesetzter bringt seine Fortran-Umgebung auf dem neuesten Stand.
Hier ist eine Funktion für Fortran 2003, das setzt eine belegbar string (InLine) der genau die Länge der Eingabe-Zeichenkette (Optional getrimmt), oder zurück .falsch. wenn das Ende der Datei
Beispielsweise etwas zu tun mit alle Zeilen in einer Datei mit der Einheit "aunit" tun
Benutzt habe ich die folgenden. Lassen Sie mich wissen, ob es besser oder schlechter als Ihr.
Ich bin mit Fortran 90, dies zu tun:
Können Sie einfach erklären, Seq, um eine große Zeichenfolge und dann schneiden Sie es, wie Ihr es schreiben. Ich weiß nicht, wie koscher ist diese Lösung aber es funktioniert sicherlich für meine Zwecke. Ich weiß, dass einige Compiler unterstützen keine "variable format "Ausdrücke", aber es gibt verschiedene workarounds, um die gleiche Sache fast so einfach.
GNU-Fortran-variable, Ausdruck Abhilfe.
Seq
zu werden "groß genug", aber die Frage ist precisly darüber, wie Sie vermeiden, dies zu tun. Auch, warum man nicht einfachwrite(*, '(A)') trim(Seq(I))
?