Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jean
Anmeldungsdatum: 26.12.2004 Beiträge: 15 Wohnort: Schweiz
|
Verfasst am: 26.12.2004, 19:12 Titel: Fehler im Code... warum ? |
|
|
Hallo
Ich habe jezt mal selbst versucht die lezten Zeilen einer Datei auszulesen nur leider kommt bei mir immer die Meldung "Eingabe nach Dateiende". Die Meldung erscheint jeweils bei der Zeile "LINE INPUT #4, forelast$" und bei "LINE INPUT #5, fivelast$"
Hier der ganze Code:
Code: |
Datei$ = "TEST.TXT"
OPEN Datei$ FOR INPUT AS #2
DO
LINE INPUT #2, temp$
GesamtZeilen% = GesamtZeilen% + 1
LOOP UNTIL EOF(2)
CLOSE #2
OPEN Datei$ FOR INPUT AS #3
GesamtZeilen% = GesamtZeilen% - 1
DO
LINE INPUT #3, twolast$
temp% = temp% + 1
LOOP UNTIL temp% = GesamtZeilen%
CLOSE #3
OPEN Datei$ FOR INPUT AS #4
GesamtZeilen% = GesamtZeilen% - 3
DO
LINE INPUT #4, forelast$
temp% = temp% + 1
LOOP UNTIL temp% = GesamtZeilen%
CLOSE #4
OPEN Datei$ FOR INPUT AS #5
GesamtZeilen% = GesamtZeilen% - 5
DO
LINE INPUT #5, fivelast$
temp% = temp% + 1
LOOP UNTIL temp% = GesamtZeilen%
CLOSE #5
PRINT twolast$
PRINT forelast$
PRINT fifelast$ |
Vielen Dank  |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 26.12.2004, 19:30 Titel: Anmerkungen |
|
|
Hallo.
Da hab ich mir so viel Mühe gemacht, einen Code geschrieben, der funktioniert und zuverlässig ist und dann machst du selbst sowas daraus...
Um zur Sache zurückzukommen: Gut gemeinter Rat: Nimm lieber meinen Code und stell Fragen dazu.
Anmerkungen zu deinem Code:
- Wenn man eine Datei schließt und wieder öffnet, fängt das Einlesen wieder ganz am Anfang an.
- Wenn du CLOSE #2 machst, darfst du danach natürlich beim nächsten OPEN wieder #2 nehmen! Du darfst bloß nicht eine geöffnete Nr. nochmal öffnen.
- Das mit dem Zähler sieht mir sehr durcheinander und verbuggt aus...
- (Es müsste vermutlich secondlast$ usw. heißen... (=> Ordnungszahlen))
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 26.12.2004, 19:45 Titel: |
|
|
Und wenn Datei$ riesengross ist (Logfiles bei mir auf dem Webserver können locker 100 MB und mehr umfassen!), wird die Performance erst noch unbrauchbar. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
DirtyHarry
Anmeldungsdatum: 21.11.2004 Beiträge: 23 Wohnort: Brachttal ca 40km von Hanau
|
Verfasst am: 26.12.2004, 20:25 Titel: .... |
|
|
Hallo,
was mich etwas irritiert, warum du mittlerweile den 4. Thread aufgemacht hast, für ein Thema.
Zum Thema:
- Wenn du unbedigt deinen Code verwenden willst, musst du die temp% zwischen dem einlesen wieder auf 0 setzen, sonst ist temp% schon beim beim 3. mal (LINE INPUT #4,forelast$) einlesen größer als die GesamtZeilen%. Kannst du sehen, wenn du dir die Variablen anzeigen lässt, und schritweise ausführst.
- Angenommen deine Datei$ hat 20 Zeilen: 20-1=19, 19-3=16 ,16-5=11.
Lasse lieber GesmatZeilen% das was es ist und mach das minus in der Bedingung für das LOOP.
- Da waren schon Überlegungen, ob nicht zweimal einlesen nicht schon zu langsam wäre, nun liest du die Datei sogar 4 mal ein.
Code: |
Datei$ = "TEST.TXT"
OPEN Datei$ FOR INPUT AS #2
DO
LINE INPUT #2, temp$
GesamtZeilen% = GesamtZeilen% + 1
LOOP UNTIL EOF(2)
CLOSE #2
OPEN Datei$ FOR INPUT AS #3
DO
LINE INPUT #3, twolast$
temp% = temp% + 1
LOOP UNTIL temp% = GesamtZeilen% - 1
CLOSE #3
temp% = 0
OPEN Datei$ FOR INPUT AS #4
DO
LINE INPUT #4, forelast$
temp% = temp% + 1
LOOP UNTIL temp% = GesamtZeilen% - 3
CLOSE #4
temp% = 0
OPEN Datei$ FOR INPUT AS #5
DO
LINE INPUT #5, fivelast$
temp% = temp% + 1
LOOP UNTIL temp% = GesamtZeilen% - 5
CLOSE #5
PRINT twolast$
PRINT forelast$
PRINT fivelast$
|
_________________ Gruß Andreas
---------
Aller Anfang ist schwer.
Meine Probleme(Ideen) möchte ich keinem anderen zumuten.
Kostenlose Operalizens bei mehr als 250 Klicks:
http://www.opera-for-dryhar.de.vu |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 26.12.2004, 20:59 Titel: Re: .... |
|
|
DirtyHarry hat Folgendes geschrieben: | Da waren schon Überlegungen, ob nicht zweimal einlesen nicht schon zu langsam wäre, nun liest du die Datei sogar 4 mal ein. |
@Sebastian: Diesen Punkt wollte ich bezüglich unbrauchbarer Performance hervorstreichen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
DirtyHarry
Anmeldungsdatum: 21.11.2004 Beiträge: 23 Wohnort: Brachttal ca 40km von Hanau
|
Verfasst am: 26.12.2004, 21:11 Titel: |
|
|
Wenn man den Code von Sebastian etwas abändert und merkt sich immer die letzten 10 Zeilen, bekommt man dies:
Code: |
DIM GesamtZeilen AS INTEGER
DIM DATEI AS STRING
DIM Last10Lines(1 TO 11) AS STRING
DIM ZEILEN(1 TO 5) AS STRING
DIM ZEILENNR(1 TO 5) AS INTEGER
DATEI = "TEST.TXT"
OPEN DATEI FOR INPUT AS #1
DO 'Merkt sich immer nur die 10 zuletzt eingelesenen Zeilen!
LINE INPUT #1, Last10Lines(10)
GesamtZeilen = GesamtZeilen + 1
IF NOT EOF(1) THEN
FOR x% = 1 TO 10
Last10Lines(x%) = Last10Lines(x% + 1)
NEXT x%
END IF
LOOP UNTIL EOF(1)
CLOSE #1
PRINT "Die Datei hat insgesamt "; LTRIM$(STR$(GesamtZeilen)); " Zeilen."
j% = 10
FOR i% = 1 TO 5
ZEILENNR(i%) = GesamtZeilen + 1 - j%
PRINT "Die "; LTRIM$(STR$(j%)); ". letzte Zeile ist Zeilennummer "; LTRIM$(STR$(ZEILENNR(i%))); "."
ZEILEN(i%) = Last10Lines(11 - j%) 'Nur die gew?nschten Zeilen ?bernehmen
j% = j% - 2
NEXT i%
PRINT : PRINT
COLOR 14: PRINT "Und nun das Ergebnis:": PRINT : COLOR 7
FOR i% = 1 TO 5
PRINT ZEILEN(i%)
NEXT i%
SLEEP: END
|
Dadurch braucht man die Datei nur noch einmal einzulesen. _________________ Gruß Andreas
---------
Aller Anfang ist schwer.
Meine Probleme(Ideen) möchte ich keinem anderen zumuten.
Kostenlose Operalizens bei mehr als 250 Klicks:
http://www.opera-for-dryhar.de.vu |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 26.12.2004, 23:37 Titel: Benchmark |
|
|
Hallo.
Klar, so ists noch besser, aber so katastrophal ist das Resultat einer Zeitmessung bei meinem Code auch nicht.
Für eine 141MB große Textdatei mit 5 Millionen Zeilen brauchte der Source gerade einmal 32 Sekunden inklusive Zeilenzählen am Anfang.
Der eingesetzte PC ist 1533 MHz schnell und läuft unter W2k.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
DirtyHarry
Anmeldungsdatum: 21.11.2004 Beiträge: 23 Wohnort: Brachttal ca 40km von Hanau
|
Verfasst am: 27.12.2004, 04:59 Titel: |
|
|
Zu Thema Performance:
Eingesetzter PC: Pentium 800
System: Win XP Pro
Anzahl der Zeilen: 5.000.000
Größe der Datei: 156MB
Zeit mit dem Code von Sebastian: 1:31Min
Zeit mit meinem Code: 1:25Min
Zeit mit dem Code von Jean: 2:35Min 'Und da sind nur 3 Zeilen als Ergebnis.....
Wer kann mir jetzt erklären, wo der geringe Unterschied zwischen Sebastians Code und meinem herkommt?
@Jean:
Falls du vor hast, so große Dateien zu benutzen, musst du alle Variablen, die mit der Zeilenzahl zu tun haben als DOUBLE deklarieren. _________________ Gruß Andreas
---------
Aller Anfang ist schwer.
Meine Probleme(Ideen) möchte ich keinem anderen zumuten.
Kostenlose Operalizens bei mehr als 250 Klicks:
http://www.opera-for-dryhar.de.vu |
|
Nach oben |
|
 |
Stephan

Anmeldungsdatum: 05.10.2004 Beiträge: 358 Wohnort: Hessen - 20km Nördlich von Frankfurt am Main
|
Verfasst am: 27.12.2004, 05:57 Titel: |
|
|
warscheinlich weil Sebastians version die datei 2x durchgeht.
1x Zum zeilen Zählen,
1x Einlesen der zeilen
(Wenn ich die version aus diesem thread hier benutze http://forum.qbasic.at/viewtopic.php?t=354 ) _________________ 'Wir schätzen die Zeit erst, wenn uns nicht mehr viel davon geblieben ist.'
Leo Tolstoi |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 27.12.2004, 14:17 Titel: CURRENCY |
|
|
Hallo.
Tja, dann freue ich mich mal, dass mein Code doch so gut abschneidet.
Zu den Datentypen:
Wenn du QBX benutzt, nimm CURRENCY (8 Bytes). Das ist für fast unendlich große Ganzzahlen mit bis zu 3 oder 4 Kommastellen.
Siehe dazu folgendes "Datenblatt" zu den Datentypen: [Link]
Gewöhnlich sollte LONG aber auch reichen. Das geht bis 2,147 Milliarden...
Viele Grüße!
Sebastian
PS: Man könnte Harrys Code und vielleicht auch meinen auch in die MonFAQ nehmen, sofern da nicht schon sowas drin ist. _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
|