Funktion zum Text zeilenweise auslesen

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

KnorxThieus

Betreff: Funktion zum Text zeilenweise auslesen

BeitragSo, Apr 22, 2012 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,


ich versuche mich gerade an einer -eigentlich- einfachen Funktion, mit der ich einen text zeilenweise auslesen kann. Das brauche ich für ein Programm, das einen Dateitext mehrmals ausliest. Also habe ich die Datei in einen String kopiert und will jetzt ReadLIne durch eine gewisse GetRow-Funktion ersetzen:
BlitzBasic: [AUSKLAPPEN]
Function GetRow$(txt$, row = 1)

;Stop

For b = 1 To row
c$ = ""
Repeat
a = a + 1
tmpc$ = c$
c$ = Mid$(txt$, 1, a)
Until Right$(c$, 1) = Chr$(10)
Next
If tmpc$ = "" And b <> row tmpc$ = " "
Return tmpc$
End Function

;Stop
t$ = GetFileText$(RequestFile("Browse a file!"))

Repeat
a = a + 1
r$ = GetRow$(t$, a)
Notify r$
Until r$ = ""



;under functions ; not here created

Function GetFileText$(file$)
If Not FileType(file$) Return
f = ReadFile(file$)
If Not f Return
ret$ = ReadLine$(f)
Repeat
ret$ = ret$ + Chr$(10) + ReadLine$(f)
Until Eof(f)
Return ret$
End Function



Achso, die Variablen stehen für hat Folgendes geschrieben:
c$ ==> cutted - geschnitten
tmpc$ ==> temporärer Schniitt - Damit der Zeilenumbruch nicht mit ausgegeben wird



Tja, hier bin ich stecken geblieben

HIlfe!

mfg
KT-Noob

;GetFileText funktioniert!
Version: BlitzPlus / Blitz+
  • Zuletzt bearbeitet von KnorxThieus am So, Apr 22, 2012 14:54, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragSo, Apr 22, 2012 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wo ist die Fehlerbeschreibung? Was geht nicht bzw. fehlt?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Xeres

Moderator

BeitragSo, Apr 22, 2012 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Immer wieder den gesamten Text zu zerteilen ist nicht unbedingt optimal. Zähle die Zeilen, Spring zum Anfang zurück und lies alles in ein passendes Array ein.

Arrow SeekFile

...und bitte benutze keine >|<speziellen>|< Zeichen als Textauszeichnung im Titel, das findet doch dann niemand über die Suche.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

KnorxThieus

BeitragSo, Apr 22, 2012 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Array?

@BladeRunner: Funktioniert gar nicht
Version: BlitzPlus / Blitz+

Xeres

Moderator

BeitragSo, Apr 22, 2012 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Dim Array.
"Funktioniert nicht" ist keine Fehlerbeschreibung. Was soll passieren, was passiert stattdessen?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

KnorxThieus

BeitragSo, Apr 22, 2012 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ziel: Rückgabe der per row-Parameter eingegebenen Zahl
Fehler: Es werden - es sei denn, die ausgewählte Zeile enthält keine Zeichen - alle Zeilen bis zur ausgewählten zurückgegeben.
(Soll ich das oben per EDIT anhängen?)

Zum Array: Ich probiere mal, aber ich glaube das ändert nichts an der Sachlage.

EDIT: Eh, wird wohl länger dauern. Hatte mal nen Crash und muss erst meine Zeilenzählfunktion suchen... Rolling Eyes

EDIT: Diese Zeilenzählfunktion diente nur dem Zählen von Dateien. Wenn ich das jetzt einem Text anpasse, müsste ich ja einen Ersatzbefehl für ReadLine finden: GetRow! Uahhh....
Version: BlitzPlus / Blitz+
  • Zuletzt bearbeitet von KnorxThieus am So, Apr 22, 2012 15:52, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSo, Apr 22, 2012 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Variablen a, b und c zu nennen ist suboptimal.
und wie sollen row und tmpc$ hier verknüpft sein?
Code: [AUSKLAPPEN]
b <> row tmpc$ = " "

Schreibe Then aus, wenn du erwartest, dass andere deinen Code lesen, um dir zu helfen.

Wenn jede Zeile in einem Feld vom Array steht, kannst du sie direkt ansprechen - Stringoperationen sind nicht nötig.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

KnorxThieus

BeitragSo, Apr 22, 2012 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Dass KnorxThieus, Xeres hat Folgendes geschrieben:
BlitzBasic: [AUSKLAPPEN]
If tmpc$ = "" And b <> row tmpc$ = " "

Wenn noch nicht die letzte Zeile erreicht ist und in der aktuellen nichts steht, dann füge ein Leerzeichen ein, damit das Beispielprogramm nicht Schluss macht! Dämlich. Ich weiß, ich hätte das Beispielprogramm anpassen sollen..

[Siehe EDIT2 im letzten Beitrag] Diese Schleifensituation... was mache ich da?
Version: BlitzPlus / Blitz+

Midimaster

BeitragSo, Apr 22, 2012 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn Du nach einem best. Zeichen im Text suchen willst, musst Du nicht en Text Zeichen für Zeichen durchgehen, sondern kannst mit der Funktion INSTR() sofort die nächste Position dieses Zeichens im Text erfahren:

BlitzBasic: [AUSKLAPPEN]

; syntax: INSTR( VorlageText$, GesuchtesZeichen$, AbHierSuchen%)
Local Da%=0
Repeat
Da=Instr(Text$ , Chr(10) , da%+1)
Print "Zeilenumbruch gefunden bei " + Da
Until da=0
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

KnorxThieus

BeitragSo, Apr 22, 2012 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, aber ich komme hier einfach nicht mit der Logik klar: Wie muss ich die Befehle mit einander verknüpfen? Embarassed
Version: BlitzPlus / Blitz+

Midimaster

BeitragSo, Apr 22, 2012 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Nach deiner Beschreibung des Ziels der neu zu entwickelnden Funktion, suchst Du scheinbar nach einer Funktion, die eine bestimmte Zeile aus der Datei herauspickt, z.B. die 5. Zeile?

Aber genau das kann doch schon die Standard-Routine zum Dateilesen:


BlitzBasic: [AUSKLAPPEN]
Stream=ReadFile("datei.txt")
While Eof(Stream)=0
Txt$=ReadLine(Stream)
i=i+1
Print "Zeile " + i + "=" + txt
Wend


ReadLine() liest ja genau ZEILENWEISE!

Hier müsstest Du jetzt doch nur noch bei einem best i% abbrechen und Txt$ zurückgeben, oder?


Trotzdem hast die gesamte Datei zu einen String verbacken, in dem nun bereits mehrere CHR(10) sind.
Aber auch dann lässt sich jeder Zeile wieder trennen:

Das war mein Beispel, hier mal als Funktion:
BlitzBasic: [AUSKLAPPEN]

Function GetRow$(Txt$, Row%=1)
Local Da%=0, AbHier%=1, Teil$="", i%=0
Repeat
; zunächst wird nach der Stelle mit dem CHR(10) Zeichen gesucht:
Da=Instr(Txt$ , Chr(10) , AbHier)

; Stelle erfolgreich gefunden und wird gezählt
i=i+1
Print i + ". Zeilenumbruch gefunden bei " + Da

; falls die Anzahl der gesuchten Row entspricht dann weitere behandlung des Textes:
If i=Row Then

; Schnitt
Teil$= Mid(Txt$ , AbHier, Da-Abhier-1)
Print "Der Teilstring=" + Teil$
Return Teil$
EndIf

; die nächste Suche beginnt da, wo die alte Suche endete
AbHier=Da+1
Until da=0
End Function



Beschreib doch mal genauer wo das ganze eingesetzt wird....

Und beschreib auch bitte, warum Du glaubst, dass man die Datei mehrfach einlesen müsste?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

KnorxThieus

BeitragMo, Apr 23, 2012 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstens: Ich habe meinen text nicht mehr als Datei?
2. Dein Bsp. funktioniert bei mir nicht Sad

3. In einem simplen Versuch eines Translaters...
für jedes Wort das gesamte Vokabular.

6. Lagsam verlier ich den Überblick... ich brauche die vokabeldatei als variablen aray... hab wohl falsch angefangen,,, Embarassed *10^99
BlitzBasic: [AUSKLAPPEN]
file$ = RequestFile$()

Global rows = CountFileRows(file$)
Dim farray$(rows)

LoadFileArray(file$)

Notify farray$(7)


Function LoadFileArray(file$)
If Not FileType(file$) Return
f = ReadFile(file$)
If Not f Return
For a = 1 To rows
farray$(a) = ReadLine$(f)
Next
Return True
End Function


Function CountFileRows(file$)
ft = FileType(file$)
If ft = 0 Then Return
If ft = 1 Then stream = ReadFile(file$)
If ft = 2 Then stream = ReadDir(file$)
nf$ = 1
Repeat
;Stop
If ft = 1 Then ReadLine$(stream)
If ft = 2 Then nf$ = NextFile$(stream)
nor = nor + 1
If ft = 1 nf$ = Eof(stream) - 1
Until Int(nf$) = 0
Return nor
End Function


Sorry leute
Code: [AUSKLAPPEN]
.error159="Festplattedurchgeschmort"
usern$="KnorxThieus"
Version: BlitzPlus / Blitz+

Midimaster

BeitragDi, Apr 24, 2012 1:36
Antworten mit Zitat
Benutzer-Profile anzeigen
ich glaube, jetzt bist du auf dem richtigen Weg! Deine erste Version war viel zu sehr "um die Ecke gedacht". Jetzt hört sich das viel klarer an.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

KnorxThieus

BeitragDi, Apr 24, 2012 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
schön. Smile
Version: BlitzPlus / Blitz+

Xeres

Moderator

BeitragDi, Apr 24, 2012 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles, was du öffnest, solltest du auch wieder schließen; CloseFile, CloseDir
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

KnorxThieus

BeitragMi, Apr 25, 2012 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
mir bekannt Wink

blöd sind bloß diese globalen... die man nicht in der funktion erstellen darf Sad
Version: BlitzPlus / Blitz+

Xeres

Moderator

BeitragMi, Apr 25, 2012 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum tust du es dann nicht? Es könnte mysteriöse Speicher/Ladefehler ergeben, wenn du alle Streams offen lässt.
Um Globale Variablen kommt man manchmal nicht herum, dass sollte man halt nur auf das nötigste reduzieren. Das Array musst du zwar im Hauptprogramm das erst mal angeben, aber danach kannst du es in der Funktion einfach vergrößern:

BlitzBasic: [AUSKLAPPEN]
Dim Zeilen$(0)

;[...]

Function LoadFileArray(file$)
;[...]
Dim Zeilen$(CountFileRows(file$))
End Function
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

KnorxThieus

BeitragMi, Apr 25, 2012 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach! Das kannte ich noch nicht.

Danke Razz


EDIT: und als ich jetzt in meine funktion-include-file reinsetze: "duplicate indentifier" als ich rausnehme(aus den globalen): "array not found in main programm" ha? Shocked
Version: BlitzPlus / Blitz+

Xeres

Moderator

BeitragMi, Apr 25, 2012 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
...wie immer: ohne Code kann man lange raten...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

KnorxThieus

BeitragMi, Apr 25, 2012 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte!
Wenn was fehlt, must du mirs sagen
Version: BlitzPlus / Blitz+

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group