 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
rix
Anmeldungsdatum: 20.03.2007 Beiträge: 20
|
Verfasst am: 21.03.2007, 14:22 Titel: Zeichenkette in Datei finden |
|
|
Hallo mal wieder,
haltet mich für blöd aber ich bekomme es nicht hin.
Ich muss in einer Datei eine bestimme Zeichenkette/Wort finden mehr nicht!
Code: |
FEHLER$ = "Z_MALLOC"
DATEI$ ="C:\bla.txt"
...
|
...
Code: |
...
OPEN DATEI$ FOR BINARY SHARED AS #99
DO
GET #99,, INHALT$
LOOP UNTIL (EOF(99))
CLOSE #99
IF NOT INSTR(INHALT$,FEHLER$) THEN
COLOR ,2
LOCATE 12,1
PRINT " --> running ... ", DATE, TIME
...
|
"running" gibt er nicht aus, obwohl Z_MALLOC nicht in der Datei vorkommt.
Was stimmt daran nicht? Könnt ihr mir nochmal helfen? |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 21.03.2007, 14:43 Titel: |
|
|
Hi, Code: | IF NOT INSTR(INHALT$,FEHLER$) THEN | ist hier nicht brauchbar, besser Code: | IF INSTR(INHALT$,FEHLER$) = 0 THEN | aber ob das allein der Fehler ist?
Wird in INHALT$ die ganze Datei geladen, oder nur eine Zeile?
Dann wird ja nur die letzte Zeile geprüft? _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 21.03.2007, 14:49 Titel: |
|
|
Da wär noch eine Sache,
wenn man bei der Binary methode einen string ausliest muss man vorher noch festlegen wie lang dieser String sein soll, wenn das nicht definiert ist liest FB nur 1 bzw 0 zeichen aus der Datei und kann somit keinen längeren String darin finden...
also solltest Du vorher noch
Code: | Dim readstring as string *100 |
machen, bzw grösser oder kleiner als 100 je nachdem wie gross der zu suchende Inhalt ist.... _________________
 |
|
Nach oben |
|
 |
rix
Anmeldungsdatum: 20.03.2007 Beiträge: 20
|
Verfasst am: 21.03.2007, 14:51 Titel: |
|
|
Hallo,
leider funktioniert das nicht.
Kann ich überhaupt "strings" benutzen, beim INSTR(STR1$,STR2$)?
Mmhhh  |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 21.03.2007, 14:52 Titel: |
|
|
Versuchs mal mit "IF INSTR(inhalt$, fehler$)=0 THEN ..."
Ich weiß nicht ob es daran liegen könnte, wenn nicht, dann müsste ich mal die Datei sehen oder so.
EDIT: Na toll, ich hab vor ner langen Zeit auf Antworten geklickt und bin erst jetzt dazu gekommen, ne antwort zu schreiben... zu spät.. sry. _________________
Code: | #include "signatur.bi" |
Zuletzt bearbeitet von Michael712 am 21.03.2007, 14:59, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
rix
Anmeldungsdatum: 20.03.2007 Beiträge: 20
|
Verfasst am: 21.03.2007, 14:52 Titel: |
|
|
Ah okay, das probier ich mal |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 21.03.2007, 15:00 Titel: |
|
|
Code: |
Dim inhalt as string*100
Dim fehler as string
Dim datei as string
fehler = "BM"
datei ="test.bmp"
OPEN datei FOR BINARY SHARED AS #99
DO
GET #99,,inhalt
IF INSTR(inhalt,fehler) = 0 THEN
COLOR ,2
LOCATE 12,1
PRINT " --> running ... ", DATE, TIME
Else
?counter+instr(inhalt,fehler),mid$(inhalt,instr(inhalt,fehler),len(fehler))
Close #99
Exit Do
end if
counter+=100
LOOP UNTIL (EOF(99))
Close #99
sleep
|
_________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 21.03.2007, 15:00 Titel: |
|
|
versuch mal: Code: | X = 0
OPEN DATEI$ FOR INPUT AS #99
DO
LINE INPUT #99, INHALT$
X = X + INSTR(INHALT$, FEHLER$)
LOOP UNTIL (EOF(99))
CLOSE #99
IF X = 0 THEN
COLOR ,2
LOCATE 12,1
PRINT " --> running ... ", DATE, TIME |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
rix
Anmeldungsdatum: 20.03.2007 Beiträge: 20
|
Verfasst am: 21.03.2007, 15:02 Titel: |
|
|
Vielen vielen Dank für die Antworten
Das mit dem DIM inhalt as string hat geklappt!
@eternal_pain, volta --> extra Dank an Eure Schreibgeilheit  |
|
Nach oben |
|
 |
rix
Anmeldungsdatum: 20.03.2007 Beiträge: 20
|
Verfasst am: 21.03.2007, 15:48 Titel: Speicherproblem |
|
|
Hallöchen, habe den Code jetzt verfolständigt.
Das funktioniert echt supi! Nur bei jeden Lesevorgang steigt RAM Verbrauch des Programms an. von 1.7 MB immer weiter bei 300 MB habe ich abgebrochen
Code: |
CLS
FEHLER$ = "Z_MALLOC"
COLOR, 4
LOCATE 1,16
PRINT "****** Game Server Status ******"
LOCATE 24,16
PRINT "****** http://blabla.de ******"
COLOR, 0
LOCATE 4,1
INPUT "Geben Sie den Pfad zur Logdatei an: ", logdatei$
LOCATE 5,1
INPUT "Geben Sie das Zeitintervall ein: ", ZEIT
LOCATE 6,1
INPUT "Geben Sie den Servernamen ein: ", NAME1$
LOCATE 7,1
PRINT " "
WORK:
SLEEP ZEIT
OPEN logdatei$ FOR INPUT SHARED AS #99
X = 0
DO
LINE INPUT #99, INHALT$
X = X + INSTR(INHALT$, FEHLER$)
LOOP UNTIL (EOF(99))
CLOSE #99
IF X = 0 THEN
INHALT$ =""
COLOR ,2
LOCATE 12,1
PRINT NAME1$; " --> running ... ", DATE, TIME
GOTO WORK
ELSE
INHALT$ =""
CLOSE #99
COLOR,4
LOCATE 13,1
PRINT NAME1$; " --> something bad ... ", DATE, TIME
COLOR, 2
LOCATE 14,1
PRINT NAME1$; " --> rescue action ... ", DATE , TIME
SLEEP 3
REM SHELL "taskkill /IM sturmbahn.exe"
REM SHELL "c:\gameserver\et\sturmbahn_255\stumbahn.bat
GOTO WORK
END IF
|
Und ich weiß nicht warum... Nach dem lesen leere ich "INHALT$" wieder?
Ne Idee?
Zuletzt bearbeitet von rix am 21.03.2007, 16:14, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
 |
rix
Anmeldungsdatum: 20.03.2007 Beiträge: 20
|
Verfasst am: 21.03.2007, 15:49 Titel: Speicherproblem |
|
|
Hallöchen, habe den Code jetzt verfolständigt.
Das funktioniert echt supi! Nur bei jeden Lesevorgang steigt RAM Verbrauch des Programms an. von 1.7 MB immer weiter bei 300 MB habe ich abgebrochen
Code: |
CLS
FEHLER$ = "Z_MALLOC"
COLOR, 4
LOCATE 1,16
PRINT "****** Game Server Status ******"
LOCATE 24,16
PRINT "****** blala.de ******"
COLOR, 0
LOCATE 4,1
INPUT "Geben Sie den Pfad zur Logdatei an: ", logdatei$
LOCATE 5,1
INPUT "Geben Sie das Zeitintervall ein: ", ZEIT
LOCATE 6,1
INPUT "Geben Sie den Servernamen ein: ", NAME1$
LOCATE 7,1
PRINT " "
WORK:
SLEEP ZEIT
OPEN logdatei$ FOR INPUT SHARED AS #99
X = 0
DO
LINE INPUT #99, INHALT$
X = X + INSTR(INHALT$, FEHLER$)
LOOP UNTIL (EOF(99))
CLOSE #99
IF X = 0 THEN
INHALT$ =""
COLOR ,2
LOCATE 12,1
PRINT NAME1$; " --> running ... ", DATE, TIME
GOTO WORK
ELSE
INHALT$ =""
CLOSE #99
COLOR,4
LOCATE 13,1
PRINT NAME1$; " --> something bad ... ", DATE, TIME
COLOR, 2
LOCATE 14,1
PRINT NAME1$; " --> rescue action ... ", DATE , TIME
SLEEP 3
REM SHELL "taskkill /IM sturmbahn.exe"
REM SHELL "c:\gameserver\et\sturmbahn_255\stumbahn.bat
GOTO WORK
END IF
|
Und ich weiß nicht warum... Nach dem lesen leere ich ja "INHALT$" wieder!
Ne Idee?
Die Logdatei ist ne normale Textdatei, in die der Gameserver imer reinschreibt - also nicts besonderes.
Zuletzt bearbeitet von rix am 21.03.2007, 16:15, insgesamt 4-mal bearbeitet |
|
Nach oben |
|
 |
rix
Anmeldungsdatum: 20.03.2007 Beiträge: 20
|
Verfasst am: 21.03.2007, 15:50 Titel: Speicherproblem |
|
|
sorry für den Doppelpost  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 21.03.2007, 16:15 Titel: |
|
|
könnte möglicherweise daran liegen das die Datei erstens nicht geschlossen wird und zweitens daran das GOTO WORK die datei immer wieder neu öffnet ?! _________________
 |
|
Nach oben |
|
 |
rix
Anmeldungsdatum: 20.03.2007 Beiträge: 20
|
Verfasst am: 21.03.2007, 16:17 Titel: |
|
|
Ich habe doch CLOSE# 99 drin stehen. Dann sollte die Datei theretisch geschlossen sein.
EDIT: Also ich die Datei nur einmal öffne und dann damit arbeite bleibt der verwendete Arbeitspeicher gleich. NUN FUNKTIONIERT ABER DAS HIER NICHT MEHR !!!
Code: |
DO
LINE INPUT #99, INHALT$
X = X + INSTR(INHALT$, FEHLER$)
LOOP UNTIL (EOF(99))
|
Sobald ich in die Datei "Z_MALLOC" schreibe bleibt X trotzdem 0!
X sollte dann aber > 0 sein.
Zuletzt bearbeitet von rix am 21.03.2007, 16:48, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 21.03.2007, 16:47 Titel: |
|
|
Versuch mal das Einlesen der Datei als SUB oder FUNCTION auszulagern.
Dabei könnten weniger Stringleichen zurückbleiben.
Könnte aber bei großen Dateien auch zu Abstürzen führen (zu wenig Stack). _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 21.03.2007, 16:48 Titel: |
|
|
Das war kein Doppel, sondern ein Triple-Post.
Ich würde nicht die ganze Datei in einen String lesen, sondern nur überprüfen, ob in der aktuellen Zeile der String vorkommt.
Wenn das wahr ist, ein Flag setzen und die Schleife beenden. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 21.03.2007, 16:50 Titel: |
|
|
Code: | OPEN logdatei$ FOR INPUT SHARED AS #99 |
Wozu brauchst du das SHARED eigentlich?
rix hat Folgendes geschrieben: | EDIT: Also ich die Datei nur einmal öffne und dann damit arbeite bleibt der verwendete Arbeitspeicher gleich. NUN FUNKTIONIERT ABER DAS HIER NICHT MEHR !!!
Code: |
DO
LINE INPUT #99, INHALT$
X = X + INSTR(INHALT$, FEHLER$)
LOOP UNTIL (EOF(99))
|
Sobald ich in die Datei "Z_MALLOC" schreibe bleibt X trotzdem 0!
X sollte dann aber > 0 sein. |
Klingt plausibel, weil du das EOF ja schon erreicht hattest und immer noch an dieser Stelle stehst. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Zuletzt bearbeitet von nemored am 21.03.2007, 16:54, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 21.03.2007, 16:53 Titel: |
|
|
Ich könnt mir vorstellen, dass die Log-Datei laufend weitergeschrieben wird und somit diese für das Spiel mit frei bleiben muss? _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 21.03.2007, 19:50 Titel: |
|
|
hiermit konnte ich kein Speicherfressen feststellen (nur mit 1MB Lesedatei getestet) : Code: | Dim As String FEHLER, logdatei, NAME1
Dim As Integer ZEIT
Function such(logdatei As String, FEHLER As String) As Integer
Dim As Integer ff, x = 0
Dim As String INHALT
ff= Freefile
Open logdatei$ For Input Shared As #ff
Do
Line Input #ff, INHALT
x = x + Instr(INHALT, FEHLER)
Loop Until (Eof(ff))
Close #ff
Function = x
End Function
Screen 0
Color ,1
Cls
FEHLER = "Z_MALLOC"
Color, 4
Locate 1,16
Print "****** Game Server Status ******"
Locate 24,10
Print "****** blala.de ******"
Color, 0
Locate 4,1
Input "Geben Sie den Pfad zur Logdatei an: ", logdatei
Locate 5,1
Input "Geben Sie das Zeitintervall ein [sec]: ", ZEIT
Locate 6,1
Input "Geben Sie den Servernamen ein: ", NAME1
Do
Sleep (ZEIT * 1000)
If such (logdatei, FEHLER) = 0 Then
Color ,2
Locate 12,1
Print NAME1$; " --> running ... ", Date, Time
Else
Color,4
Locate 13,1
Print NAME1$; " --> something bad ... ", Date, Time
Color, 2
Locate 14,1
Print NAME1$; " --> rescue action ... ", Date , Time
'Sleep 3
REM Shell "taskkill /IM sturmbahn.exe"
REM Shell "c:\gameserver\et\sturmbahn_255\stumbahn.bat
End If
Locate 22,16:Print "Speicher frei: ";Fre(0);" "
Loop Until Inkey = Chr(27) 'mit ESC Ende
End |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 21.03.2007, 20:04 Titel: |
|
|
Noch eine Möglichkeit, wenn du nicht die ganze Datei lesen möchtest:
Hier eine geänderte Funktion, wieviel Bytes du vom Ende der Datei lesen willst kannst du selbst abschätzen.
Code: |
Function such(logdatei As String, FEHLER As String) As Integer
Dim As Integer ff, l, x
Dim As String INHALT
ff = Freefile
Open logdatei$ For Input Shared As #ff
l = Lof(ff) - 10000 'nur die letzten 10000Byte der Datei lesen
Get #ff, l, x 'nur Dummy um Leseposition zu setzen
x = 0
Do
Line Input #ff, INHALT
x = x + Instr(INHALT, FEHLER)
Loop Until (Eof(ff))
Close #ff
Function = x
End Function
|
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|