Seite 2 von 2

Verfasst: 13.04.2008 17:46
von STARGÅTE
1. Frage ab ob eine Datei überhaupt gelesen werden kann :

Code: Alles auswählen

If ReadFile()
2. Schließe alles was du öffnest wenn du es nciht mehr brauchst:

Code: Alles auswählen

CloseFile()
3. Öffne nicht eine Datei wenn du sie erst später brauchst.

4. Rücke geschickter ein !, sonst sieht man nicht durch

Code: Alles auswählen

Global line.w
Global a_a.w
Global b_b.w
Global file$

file$ = OpenFileRequester("Öffne...","C:\","Map-Datei (*.map)|*.map|Textdatei (*.txt)|*.txt",0)

Procedure SearchOnFile(text$)
 If ReadFile(1,file$)
  
  If text$ = ""
   MessageRequester("Error","An SearchOnFile() wurde ein leerer String überreicht. Das Programm muss daher beendet werden.",0)
   End
  EndIf
  
  Repeat
   zeile$ = ReadString()
   aaa = FindString(zeile$,text$,0)
   
   If aaa
    gefunden = 1
   EndIf
   
  Until Eof(1)
  
  CloseFile(1)
 EndIf
 
 If gefunden
  ProcedureReturn 1
 Else
  MessageRequester("Error",text$+" wurde in der aktuellen Datei nicht gefunden!",0)
  ProcedureReturn 0
  End
 EndIf
 
EndProcedure

Procedure BeginEndCheck(a$,b$)
 If ReadFile(1,file$)
  
  If a$ = "" Or b$ = ""
   MessageRequester("Error","An BeginEndCheck() wurden ein oder mehrere leere Strings überreicht. Das Programm muss daher beendet werden.",0)
   End
  EndIf
  
  a_a = 0
  b_b = 0
  
  Repeat
   zeile$ = ReadString()
   
   X = FindString(zeile$,a$,0)
   If X
    a_a + 1
   EndIf
  Until Eof(1)
  
  CloseFile(1)
 EndIf
 
 If ReadFile(1,file$)
  
  Repeat
   zeile$ = ReadString()
   
   X = FindString(zeile$,b$,0)
   If X
    b_b + 1
   EndIf
  Until Eof(1)
  
  CloseFile(1)
 EndIf
 
 If b_b > a_a
  MessageRequester("Error","Es existieren mehr "+b$+" Schließungen als geöffnet werden.",0)
  ProcedureReturn 0
  End
 ElseIf a_a > b_b
  MessageRequester("Error","Es existieren mehr "+a$+" Öffnungen als geschlossen werden.",0)
  ProcedureReturn 0
  End
 Else
  ProcedureReturn 1
 EndIf
 
EndProcedure


SearchOnFile("<game>") : SearchOnFile("</game>")

BeginEndCheck("<data>","</data>")


If ReadFile(0,file$)
 
 Repeat
  line + 1
  zeile$ = ReadString()
  
  X = FindString(zeile$,"<area",0)
  If X
   Y = FindString(zeile$,"<area",X+1)
   Z = FindString(zeile$,">",X+1)
   If Y < Z
    MessageRequester("Error","Line "+Str(line)+": Im Area-Element wurde vor dessen Schließung ein "+search$+"-Element entdeckt. Möglicherweiße könnte es auch sein, dass das Area-Element nicht geschlossen wird.",0)
    End
   EndIf
  EndIf
  
 Until Eof(0)
 
 CloseFile(0)
 
EndIf

End

Verfasst: 13.04.2008 17:51
von AND51
Ich löse dann mal auf:

Tombi, du öffnest erst eine Datei mit der ID 0.
Dann rufst du deine 2 Proceudres auf, die jeweils eine Datei mit der ID 1 öffnen.
Aber wenn die Procedures fertig sind, und es ab in die Repeat-Schleife geht, dann denkt PureBasic, der ReadString() Befehl beziehe sich immernoch auf eine Datei mit der ID 1.
Du hast die erste Datei, die auf lesen willst, aber mit der ID 0 geöffnet.

STARGATE hat es unbewusst richtig gemacht und den sonst nötigen Aufruf von UseFile() vermieden, indem er die Dateien erst dann öffnet, wenn sie wirklich gebraucht werden. Mit anderen Worten: Durch seine Änderung der Reihenfolge, in der die Dateien geöffnet werden, braucht er mit UseFile() nicht die Datei zu wechseln.

Tu dir den Gefallen und hol die PB 4.00 oder höher; dann hast du solche Probleme nicht mehr.
P.S.: Nimm dir SGs Tipps zu herzen und öffne Dateien z. B. immer mit If und auch nur für die möglichst kurze Zeit, in der du sie brauchst!