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:

Fehler im Code... warum ?

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



Anmeldungsdatum: 26.12.2004
Beiträge: 15
Wohnort: Schweiz

BeitragVerfasst am: 26.12.2004, 19:12    Titel: Fehler im Code... warum ? Antworten mit Zitat

Hallo

Ich habe jezt mal selbst versucht die lezten Zeilen einer Datei auszulesen zwinkern 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 grinsen grinsen grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 26.12.2004, 19:30    Titel: Anmerkungen Antworten mit Zitat

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. zwinkern

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... grinsen (=> Ordnungszahlen))

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 26.12.2004, 19:45    Titel: Antworten mit Zitat

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


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 26.12.2004, 20:22    Titel: QB Antworten mit Zitat

Hallo.

dreael hat Folgendes geschrieben:
wird die Performance erst noch unbrauchbar.


...unbrauchbarer?

Oder wie ist das zu verstehen?

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirtyHarry



Anmeldungsdatum: 21.11.2004
Beiträge: 23
Wohnort: Brachttal ca 40km von Hanau

BeitragVerfasst am: 26.12.2004, 20:25    Titel: .... Antworten mit Zitat

Hallo,

was mich etwas irritiert, warum du mittlerweile den 4. Thread aufgemacht hast, für ein Thema. Kopf schütteln

Zum Thema:

  1. 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.
  2. 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.
  3. 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.mit dem Kopf durch die Mauer wollen

Kostenlose Operalizens bei mehr als 250 Klicks:
http://www.opera-for-dryhar.de.vu
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 26.12.2004, 20:59    Titel: Re: .... Antworten mit Zitat

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



Anmeldungsdatum: 21.11.2004
Beiträge: 23
Wohnort: Brachttal ca 40km von Hanau

BeitragVerfasst am: 26.12.2004, 21:11    Titel: Antworten mit Zitat

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.mit dem Kopf durch die Mauer wollen

Kostenlose Operalizens bei mehr als 250 Klicks:
http://www.opera-for-dryhar.de.vu
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 26.12.2004, 23:37    Titel: Benchmark Antworten mit Zitat

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



Anmeldungsdatum: 21.11.2004
Beiträge: 23
Wohnort: Brachttal ca 40km von Hanau

BeitragVerfasst am: 27.12.2004, 04:59    Titel: Antworten mit Zitat

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 mit den Augen rollen geschockt 'Und da sind nur 3 Zeilen als Ergebnis.....

Wer kann mir jetzt erklären, wo der geringe Unterschied zwischen Sebastians Code und meinem herkommt? verwundert


@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.mit dem Kopf durch die Mauer wollen

Kostenlose Operalizens bei mehr als 250 Klicks:
http://www.opera-for-dryhar.de.vu
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stephan



Anmeldungsdatum: 05.10.2004
Beiträge: 358
Wohnort: Hessen - 20km Nördlich von Frankfurt am Main

BeitragVerfasst am: 27.12.2004, 05:57    Titel: Antworten mit Zitat

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


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 27.12.2004, 14:17    Titel: CURRENCY Antworten mit Zitat

Hallo.

Tja, dann freue ich mich mal, dass mein Code doch so gut abschneidet. lächeln happy

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... zwinkern

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