Probleme mit writeline

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

102030

Betreff: Probleme mit writeline

BeitragSo, März 07, 2010 9:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Ich mach hier ein Programm, welches
Vokabeln abfragt. Es sind Vokabeln im
Fach 1, 2 und 3. immer wenn die Vokabel
richtig ist, kommt sie ein Fach weiter, aber
wenn man sie falsch schreibt, kommt sie wieder
in das erste Fach.

Nun habe ich folgende Probleme:
Arrow Wenn die Vokabel im Fach 1 ist, und man sie Falsch schreibt,
wird sie nochmal ins Fach 1 geschrieben.
Arrow Wenn eine Vokabel richtig geschrieben wurde, wird
der Eintrag im Fach, in dem sie war auch nicht gelöscht und
sie wird nicht ins nächst Fach geschrieben.

Code: [AUSKLAPPEN]

Function button_frage_func()
   button_frage_auslesen_func
   For voc.Vokabel=Each Vokabel
      If Eingabe(win,50,50,Voc\Deutsch,False)=Voc\Englisch Then
         Voc\fach=Voc\fach+1
         Notify"Richtig!"
      Else
         Notify"Falsch"+Chr$(13)+""+Chr$(13)+"Die richtige Antwort lautet:"+Chr$(13)+""+Voc\Englisch+""
         Voc\fach=1
      EndIf
   Next
   For Voc.Vokabel=Each Vokabel
      For i=1 To 3
         Datei=OpenFile("Daten/Fach "+i+"/Vokabeln.voc")
         While Not Eof(Datei)
            a=ReadLine(datei)
         Wend
         If Voc\fach=i Then
            WriteLine(Datei,Voc\Deutsch)
            WriteLine(Datei,Voc\Englisch)
            WriteLine(Datei,Datum_berechnen(i))            
         EndIf
         CloseFile(Datei)
      Next
      Delete Voc
   Next
End Function
;-----------------------------------------------------------------------------------------------------
Function button_frage_auslesen_func()
   For i=1 To 3
      Datei=OpenFile("Daten/Fach "+i+"/Vokabeln.voc")
      While Not Eof(Datei)
         Deutsch$=ReadLine(Datei)
         Englisch$=ReadLine(Datei)
         Datum_alt$=ReadLine(datei)
         Tag_alt=Mid(Datum_alt,1,2)
         Monat_alt$=Mid(Datum_alt,4,3)
         jahr_alt=Mid(Datum_alt,9,4)
         Datum_neu$=CurrentDate()
         Tag_neu=Mid(datum_neu,1,2)
         Monat_neu$=Mid(Datum_neu,4,3)
         Jahr_neu=Mid(Datum_neu,9,4)
         For i=0 To 11
            If monat_alt=monate(i) Then monat_zahl_alt=i
         Next
         For i=0 To 11
            If monat_neu=monate(i) Then monat_zahl_neu=i
         Next
         If Jahr_alt<=Jahr_neu Then
            If monat_zahl_alt<=Monat_zahl_neu Then
               If tag_alt<=tag_neu Then
                  Voc.Vokabel=New Vokabel
                  Voc\Deutsch=Deutsch
                  Voc\Englisch=Englisch
                  Voc\fach=i
               EndIf
            EndIf   
         EndIf
      Wend
      CloseFile(datei)
   Next
End Function



Kann mir jemand helfen?

Pokoyo

BeitragSo, März 07, 2010 10:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich glaube writeline ist hier nicht das Problem Wink
Du solltest die Sache anders angehen. Erstell dir ein paar stringarrays und lies die komplette Datei ein. Anschliessend kannst du deine Berechnungen bzw. Entscheidungen welche Vokabel in welches Fach gehört innerhalb der Arrays hin und herschieben. Danach wieder in die Datei schreiben.
Dann hast du eine saubere Trennung der Funktionen und dein Code wird um einiges Übersichtlicher.

mfg Pokoyo
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax|

Midimaster

BeitragSo, März 07, 2010 10:57
Antworten mit Zitat
Benutzer-Profile anzeigen
na, du müssest beim zurückschreiben erst einmal suchen, ob das Wort bereits in der Datei enthalten ist und auf jeden Fall erst einmal löschen. Das ist so wie du begonnen hast mit 3 Karteikästen sehr umstänldich zu bewerkstelligen.


Harmlose Lösung

Vielleicht wäre es sogar wesentlich schneller, wenn du jedesmal die gesamte Wortliste neu schreibst.... Also einfach alte Datei überschreiben mit allen Worten, die in die neue Datei gehören:

BlitzBasic: [AUSKLAPPEN]
   For Voc.Vokabel=Each Vokabel
For i=1 To 3
Datei=OpenFile("Daten/Fach "+i+"/Vokabeln.voc")
If Voc\fach=i Then
WriteLine(Datei,Voc\Deutsch)
WriteLine(Datei,Voc\Englisch)
WriteLine(Datei,Datum_berechnen(i))
EndIf
CloseFile(Datei)
Next


dazu ist es natürlich nötig ganz am Anfang des Programms alle Vokabeln in den Rechner zu holen. Dies gibt auch bei 10.000 Vokabeln noch keine Speicherprobleme.

Welche Du dann drannimmst entscheidest du dann quasi erst aus dem RAM. Das ist deutlich schneller und schont die Platte.

Ausblick

Eine komplett andere Möglichkeit wären feste Datensatzgrößen. Hierbei werden alle Daten die zu speichern sind auf eine max. Länge gebracht. z.b. as Datum auf 10 Stellen, die Worte selbst vielleicht auf 30 Stellen. Notfalls mit Leerzeichen füllen. Alle Daten eines Satzes werden zu einem String verbunden. Dann wird jeden Datensatz noch eine laufende Nummer verpasst. Da jetzt jeder Datensatz 10+30+30=70 (tipp: mach gleich 99 für Erweiterungen) Bytes groß ist, kannst Du die Datei öffnen und gezielt einen Datensatz mit FILESEEK herauspicken

alle Codes nur symbolisch:

BlitzBasic: [AUSKLAPPEN]
FileSeek Datei, DatenSatzNr*100
Satz=ReadLine...
Datum=Mid(Satz,1,10)
Deutsch=Mid(Satz,10,30)
English=Mid(Satz(40,30)
....


Ebenso bequem lässt er sich wieder zurückschreiben.
BlitzBasic: [AUSKLAPPEN]
FileSeek Datei, DatenSatzNr*100
Satz = Left(Datum + " ",10)
Satz = Satz + Left(Deutsch + " .... ",30)
....
WriteLine Satz...
....


Spätestens hier machen drei Dateien für die Karteikästen 1,2 und 3 keinen Sinn mehr. Packe alle Worte in eine einzige Datei und geben jeden Satz lieber noch eine Variable Voc\KarteiKasten% mit.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group