Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Zeichenkette in Datei finden

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
rix



Anmeldungsdatum: 20.03.2007
Beiträge: 20

BeitragVerfasst am: 21.03.2007, 14:22    Titel: Zeichenkette in Datei finden Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 21.03.2007, 14:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 21.03.2007, 14:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
rix



Anmeldungsdatum: 20.03.2007
Beiträge: 20

BeitragVerfasst am: 21.03.2007, 14:51    Titel: Antworten mit Zitat

Hallo,

leider funktioniert das nicht.
Kann ich überhaupt "strings" benutzen, beim INSTR(STR1$,STR2$)?

Mmhhh weinen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 21.03.2007, 14:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
rix



Anmeldungsdatum: 20.03.2007
Beiträge: 20

BeitragVerfasst am: 21.03.2007, 14:52    Titel: Antworten mit Zitat

Ah okay, das probier ich mal
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 21.03.2007, 15:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 21.03.2007, 15:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
rix



Anmeldungsdatum: 20.03.2007
Beiträge: 20

BeitragVerfasst am: 21.03.2007, 15:02    Titel: Antworten mit Zitat

Vielen vielen Dank für die Antworten lächeln

Das mit dem DIM inhalt as string hat geklappt!

@eternal_pain, volta --> extra Dank an Eure Schreibgeilheit grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
rix



Anmeldungsdatum: 20.03.2007
Beiträge: 20

BeitragVerfasst am: 21.03.2007, 15:48    Titel: Speicherproblem Antworten mit Zitat

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 durchgeknallt

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
Benutzer-Profile anzeigen Private Nachricht senden
rix



Anmeldungsdatum: 20.03.2007
Beiträge: 20

BeitragVerfasst am: 21.03.2007, 15:49    Titel: Speicherproblem Antworten mit Zitat

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 durchgeknallt

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
Benutzer-Profile anzeigen Private Nachricht senden
rix



Anmeldungsdatum: 20.03.2007
Beiträge: 20

BeitragVerfasst am: 21.03.2007, 15:50    Titel: Speicherproblem Antworten mit Zitat

sorry für den Doppelpost traurig
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 21.03.2007, 16:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
rix



Anmeldungsdatum: 20.03.2007
Beiträge: 20

BeitragVerfasst am: 21.03.2007, 16:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 21.03.2007, 16:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 21.03.2007, 16:48    Titel: Antworten mit Zitat

Das war kein Doppel, sondern ein Triple-Post. durchgeknallt

Ich würde nicht die ganze Datei in einen String lesen, sondern nur überprüfen, ob in der aktuellen Zeile der String vorkommt. neutral
Wenn das wahr ist, ein Flag setzen und die Schleife beenden.
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 21.03.2007, 16:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 21.03.2007, 16:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 21.03.2007, 19:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 21.03.2007, 20:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz