FRead() wo liegt da das Ende?
Moderator: Moderatoren
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
FRead() wo liegt da das Ende?
Moin,
es geht immer noch um meine besagte Textdatei. Mittlerweile ist sie 2.149.425.908 Bytes groß. Nachdem ich FReadStr() gegen FRead() ausgetauscht habe, komme ich trotzdem nicht weiter. Es sieht so aus, als wenn die Datei zu groß wäre. Kann es sein? Sie wird doch auch unter 32Bit Windows erzeugt. Anfänglich dachte ich, es wäre ein Steuerzeichen irgendwo falsch drin, aber wenn man den Anfang der Datei kappt, dann läuft das Programm bis zum Ende durch.
es geht immer noch um meine besagte Textdatei. Mittlerweile ist sie 2.149.425.908 Bytes groß. Nachdem ich FReadStr() gegen FRead() ausgetauscht habe, komme ich trotzdem nicht weiter. Es sieht so aus, als wenn die Datei zu groß wäre. Kann es sein? Sie wird doch auch unter 32Bit Windows erzeugt. Anfänglich dachte ich, es wäre ein Steuerzeichen irgendwo falsch drin, aber wenn man den Anfang der Datei kappt, dann läuft das Programm bis zum Ende durch.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Markus Walter
- Programmier-Gott
- Beiträge: 1018
- Registriert: Di, 24. Jan 2006 10:22
- Wohnort: Saarland
Re: FRead() wo liegt da das Ende?
Hi Manfred,
der Sinn von fread liegt darin, dass man in einer Schleife auch "kleinere" Portionen einer Datei lesen kann (der Zeiger in der Datei wird immer um die gelesene Anzahl Bytes nach vorne gesetzt). Ich kenne jetzt aber Dein Urspungsproblem nicht wirklich...
der Sinn von fread liegt darin, dass man in einer Schleife auch "kleinere" Portionen einer Datei lesen kann (der Zeiger in der Datei wird immer um die gelesene Anzahl Bytes nach vorne gesetzt). Ich kenne jetzt aber Dein Urspungsproblem nicht wirklich...
Gruß
Markus
Mitglied der XUG Saarland-Pfalz
Markus
Mitglied der XUG Saarland-Pfalz
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: FRead() wo liegt da das Ende?
ich lese immer 4k ein und verarbeite sie. Dann Fseek() und dann wieder fread() bis zum Ende. So die Theorie. Aber neuerdings will das nicht mehr so. Deshalb wollte ich wissen, ob die Gesamtgröße der Datei eine Rolle spielt, wenn ich häppchenweise vom Anfang bis zum Ende durchgehend einlese.
vielleicht hilft das weiter?
vielleicht hilft das weiter?
Code: Alles auswählen
PROCEDURE artuldkonvert(oThread,oPbStart,oPbEnde)
LOCAL aArray := {}
LOCAL cAuszug
LOCAL cBuffer
LOCAL lAbbruch := .F.
LOCAL nLaenge := 0
LOCAL nStelleLF
LOCAL nStelleLF2 := 0
LOCAL oPhnUpdate := phnupdate():new()
MEMVAR oSysPara
oThread:nZeichenLaengeLesen := 4000
oPbEnde:disable()
oPbStart:disable()
oThread:lGestartet := .T.
oPbStart:setCaption("Anfangsposition Datei")
FSeek(oThread:nHandle,0,FS_SET) // an den Anfang
IF ! oSysPara:oMessage:anzeigen("ACHTUNG, die Konvertierung der Daten kann längere Zeit in Anspruch nehmen!" + CRLF +;
"Soll die Konvertierung wirklich gestartet werden?",.T.,"N")
lAbbruch := .T.
ENDIF
IF ! lAbbruch
oThread:nZaehler := 2 // weil Überschrift überspringen wird
oPhnUpdate:db_oeffnen(,.F.,.T.,,.T.,,.T.) // öffnen und immer vorher löschen, für den Fall der Fälle
oPbStart:setCaption("Daten einlesen")
cBuffer := FReadStr(oThread:nHandle,oThread:nZeichenLaengeLesen) // 1.Durchlauf
nStelleLF := AtNum(Chr(10),cBuffer,3,nStelleLF) + 1 // Überschrift übergehen
oPbStart:enable()
oPbStart:setCaption("Stop")
DO WHILE .T.
Sleep(0)
oThread:nZaehler++
IF oThread:nZaehler <= 100
oThread:oZaehler:setData()
ELSEIF oThread:nZaehler <= 1000
IF oThread:nZaehler %100 == 0
oThread:oZaehler:setData()
ENDIF
ELSE
IF oThread:nZaehler %1000 == 0
oThread:oZaehler:setData()
ENDIF
ENDIF
IF oThread:nZaehler = oThread:nMenge
EXIT
ENDIF
IF ! oThread:lGestartet
IF oSysPara:oMessage:anzeigen("Konvertieren abbrechen?",.T.,"N")
lAbbruch := .T. // damit die Artuld.txt nicht gelöscht wird
EXIT
ENDIF
oThread:lGestartet := .T.
ENDIF
nLaenge := AtNum(Chr(10),cBuffer,1,nStelleLF) - nStelleLF
IF nLaenge <= 0
nStelleLF2 += nStelleLF-1 // weil der TExt als soclhes ja länger ist
FSeek(oThread:nHandle,nStelleLF2,FS_SET) // zum letzten Linefeed gehen
FRead(oThread:nHandle,@cBuffer,oThread:nZeichenLaengeLesen) // nächsten Block einlesen
ENDIF
cAuszug := SubStr(cBuffer,nStelleLF,nLaenge)
IF ! Empty(cAuszug)
aArray := Str2Array(cAuszug)
(oPhnUpdate:nArea)->(DbAppend())
(oPhnUpdate:nArea)->v_darstell := aArray[KUENSTLER]
(oPhnUpdate:nArea)->datumvoe := SToD(aArray[VOE])
(oPhnUpdate:nArea)->datumaende := SToD(aArray[AEND])
(oPhnUpdate:nArea)->datumgestr := SToD(aArray[STREICH])
(oPhnUpdate:nArea)->ean13 := Right("0000" + Trim(aArray[EAN_UPC]),13)
(oPhnUpdate:nArea)->fsk := Val(aArray[FS])
(oPhnUpdate:nArea)->hap := Val(aArray[HAP_AKT_CE])/100
(oPhnUpdate:nArea)->label := aArray[LABEL]
(oPhnUpdate:nArea)->neu_ean := aArray[NEUE_EAN_UPC]
(oPhnUpdate:nArea)->phngenre := aArray[GENRE_S_1]
(oPhnUpdate:nArea)->phnprgart := Val(aArray[PAR])
(oPhnUpdate:nArea)->phnsystem := aArray[TART]
(oPhnUpdate:nArea)->setinhalt := Val(aArray[SET])
(oPhnUpdate:nArea)->v_titel := aArray[TITEL]
ELSE
oThread:nZaehler-- // es muß einer abgezogen werden
ENDIF
nStelleLF := AtNum(Chr(10),cBuffer,1,nStelleLF) + 1
ENDDO .T.
oThread:lGestartet := .F.
oPhnUpdate:schliesse_Datenbank()
oThread:oZaehler:setData() // nochmal am Schluß, damit Menge und Zähler vergleichbar sind
IF ! lAbbruch
oSysPara:oMessage:anzeigen("Konvertierung beendet")
ENDIF
ENDIF
FClose(oThread:nHandle) // machen wir hier mal dicht
oPbStart:disable()
oPbEnde:enable()
RETURN
********************************************************************************
FUNCTION Str2Array(cString, cDelim )
LOCAL aRet := {}
LOCAL nX := 1
LOCAL nPos := 0
LOCAL nLen
LOCAL cRet
DEFAULT cDelim TO ";"
nLen := LEN( cString )
cRet := SPACE(nLen)
DO WHILE ( .T. )
nPos := AT(cDelim, cString, nX)
IF nPos > 0
cRet := SubStr(cString, nX, nPos-nX)
AADD(aRet, cRet)
nX := ++nPos
ELSEIF nX <= nLen
cRet := SubStr(cString, nX)
aadd(aRet, cRet)
EXIT
ELSEIF nX > nLen
aadd(aRet, "")
EXIT
ELSE
EXIT
ENDIF
ENDDO
RETURN ( aRet )
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2832
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 98 Mal
- Danksagung erhalten: 13 Mal
Re: FRead() wo liegt da das Ende?
Hallo, Manfred -
welchen Wert liefert Dir
fSize(oThread:nHandle)
Gruss,
Georg
welchen Wert liefert Dir
fSize(oThread:nHandle)
Gruss,
Georg
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: FRead() wo liegt da das Ende?
Hi Georg,
exact den Wert, den die Datei selbst auch hat.
exact den Wert, den die Datei selbst auch hat.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: FRead() wo liegt da das Ende?
Hallo Manfred,
ich habe hier eine Textdatei mit 4.154.687.701 Byte erzeugt. Eingelesen und umkopiert. Das funktioniert, solange man nicht versucht das Dateiende per FSEEK() zu ermitteln:
http://www.alaska-software.com/scripts/ ... PDRID=6383
Quellcode:
Ergebnis, man beachte den Wert hinter "Größe laut FSEEK(): "
ich habe hier eine Textdatei mit 4.154.687.701 Byte erzeugt. Eingelesen und umkopiert. Das funktioniert, solange man nicht versucht das Dateiende per FSEEK() zu ermitteln:
http://www.alaska-software.com/scripts/ ... PDRID=6383
Quellcode:
Code: Alles auswählen
#include "fileio.ch"
procedure main
local cFileName := "big.txt"
local nSizeExPl := 4154687701
local cSizeExPl := " 4.154.687.701"
local nQuelle, nZiel, nBytes, nSize, cBuffer, nReadByte, x, nReadBytes, nCopyBytes
cls
set alternate to TestBigLog.txt
set alternate on
nBytes := 4096
cBuffer := space(nBytes)
?
? "Test der low level file Funktionen"
? cFileName
? "Größe laut Explorer: ",transform(nSizeExPl,"999,999,999,999"), " (numerisch)"
? "Größe laut Explorer: ",cSizeExPl, " (string)"
nQuelle := FOpen( cFileName , FO_READ )
nSize := FSeek( nQuelle, 0 , FS_END ) // gehe zum Ende
? "Größe laut FSEEK(): ", transform(nSize, "999,999,999,999"), " (numerisch)"
? "Wieder am Anfang: ", FSeek( nQuelle, 0 , FS_SET ) // gehe zum Anfang
nBytes := 4096
cBuffer := space(nBytes)
nZiel := FCreate( "NeueDatei.TXT", FC_NORMAL )
IF nZiel == -1
? "Fehler beim Erzeugen der Datei:", FError()
ELSE
x := 1
nReadBytes := 0
nCopyBytes := 0
do while nBytes > 0
if x > 100
@ 1, 40 say "gelesen: "+transform(nReadBytes, "999,999,999,999")
@ 2, 40 say "kopiert: "+transform(nCopyBytes, "999,999,999,999")
x := 1
else
x++
endif
nBytes := FRead(nQuelle, @cBuffer, len(cBuffer))
nReadBytes += nBytes
if FError() > 0
? "LESEN - FError() = ",FError()
exit
endif
nBytes := FWrite(nZiel, @cBuffer, nBytes)
nCopyBytes += nBytes
if FError() > 0
? "SCHREIBEN - FError() = ",FError()
exit
endif
enddo
ENDIF
FClose( nQuelle )
FClose( nZiel )
@ 1, 40 say "gelesen: "+transform(nReadBytes, "999,999,999,999")
@ 2, 40 say "kopiert: "+transform(nCopyBytes, "999,999,999,999")
? "Gelesen: ",transform(nReadBytes, "999,999,999,999")
? "Kopiert: ",transform(nCopyBytes, "999,999,999,999")
set alternate off
set alternate to
wait
return
Code: Alles auswählen
Test der low level file Funktionen
big.txt
Größe laut Explorer: 4.154.687.701 (numerisch)
Größe laut Explorer: 4.154.687.701 (string)
Größe laut FSEEK(): -140.279.595 (numerisch)
Wieder am Anfang: 0
Gelesen: 4.154.687.701
Kopiert: 4.154.687.701
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: FRead() wo liegt da das Ende?
Also kann ich auf jeden Fall ausschließen, dass "meine" Textdatei zu groß ist.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: FRead() wo liegt da das Ende?
Wenn man FSize() benutzt bekommt man die richtige Größe geliefert:
Code: Alles auswählen
FSize(cFileName)
FSize(nQuelle)
nSize := FSize(nQuelle)
Gruß
Hubert
Hubert
- Herbert
- Der Entwickler von "Deep Thought"
- Beiträge: 1991
- Registriert: Do, 14. Aug 2008 0:22
- Wohnort: Gmunden am Traunsee, Österreich
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: FRead() wo liegt da das Ende?
Manfred,
Kriegst du einen Fehlercode mit Ferror()?
Und wieso machst du ein Fseek? Das fread positioniert den Pointer von selbst.
Du füllst den Buffer zuerst mit FreadStr. Das heisst, du liest ein bis zum ersten CHR(0) oder der gegebenen Länge.
Falls du also auf ein Chr(0) stösst, ist cBuffer zu klein, da fread mit @cBuffer dann zu klein ist.
IF nLaenge <= 0
nStelleLF2 += nStelleLF-1 // weil der TExt als soclhes ja länger ist
FSeek(oThread:nHandle,nStelleLF2,FS_SET) // zum letzten Linefeed gehen
cBuffer:=SPACE(nZeichenLaengeLesen) // richtige Länge definieren!
FRead(oThread:nHandle,@cBuffer,oThread:nZeichenLaengeLesen) // nächsten Block einlesen
ENDIF
Vielleicht hilfts!
Kriegst du einen Fehlercode mit Ferror()?
Und wieso machst du ein Fseek? Das fread positioniert den Pointer von selbst.
Du füllst den Buffer zuerst mit FreadStr. Das heisst, du liest ein bis zum ersten CHR(0) oder der gegebenen Länge.
Falls du also auf ein Chr(0) stösst, ist cBuffer zu klein, da fread mit @cBuffer dann zu klein ist.
IF nLaenge <= 0
nStelleLF2 += nStelleLF-1 // weil der TExt als soclhes ja länger ist
FSeek(oThread:nHandle,nStelleLF2,FS_SET) // zum letzten Linefeed gehen
cBuffer:=SPACE(nZeichenLaengeLesen) // richtige Länge definieren!
FRead(oThread:nHandle,@cBuffer,oThread:nZeichenLaengeLesen) // nächsten Block einlesen
ENDIF
Vielleicht hilfts!
Grüsse Herbert
Immer in Bewegung...
Immer in Bewegung...
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1931
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: FRead() wo liegt da das Ende?
Hallo Manfred,
warum liest du die Datei nicht mit memoread - und läufst die dann mit for next durch
warum liest du die Datei nicht mit memoread - und läufst die dann mit for next durch
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: FRead() wo liegt da das Ende?
Ich habe mein Testprogramm von oben eben mit einer 6 GB Datei laufen lassen, gleiches Ergebnis.
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: FRead() wo liegt da das Ende?
weil seine Datei ...Rolf Ramacher hat geschrieben:Hallo Manfred,
warum liest du die Datei nicht mit memoread - und läufst die dann mit for next durch
für direktes Einlesen zu groß bzw. bald zu groß sein wird.Manfred hat geschrieben:Moin,
es geht immer noch um meine besagte Textdatei. Mittlerweile ist sie 2.149.425.908 Bytes groß.
Die Geschwindigkeit beim Zerhacken riesiger Dateien (über 500 MB) ist auch nicht schneller,
also 4 Kilobyte Blocks einzulesen und diese zu zerhacken, da sonst andauernd auf Festplatte aus und eingelagert werden muss ...
Manfred,
du solltest aber "Sprünge" mit FSEEK() auf jeden Fall meiden.
Es könnte zwar gehen, wenn man mehrere kleine macht, aber die Neupositionierung kostet (relativ) viel Zeit (verwerfen des Festplatten/Windows cache).
Einfach die 4 KByte Zeichenkette zerschneiden wenn man nicht mit Zeiger darin arbeiten will
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: FRead() wo liegt da das Ende?
Hm,
dann habe ich irgendwas falsch interpretiert. Ich war der Meinung ich müßte immer neu positionieren, weil ich ja nicht immer bis zum Endezeichen lese.
dann habe ich irgendwas falsch interpretiert. Ich war der Meinung ich müßte immer neu positionieren, weil ich ja nicht immer bis zum Endezeichen lese.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: FRead() wo liegt da das Ende?
FALSCH, du übergibst die Anzahl der gewünschten Bytes und erhälst die Anzahl der gelesenen (in @cBuffer).Manfred hat geschrieben:weil ich ja nicht immer bis zum Endezeichen lese.
Der Satzzeiger liegt nun auf dem nächsten zu lesenen Zeichen GENAU RICHTIG
Natürlich wird das fast immer nicht dein gewünschtes Zeilenende etc. sein, das kannst du aber leicht intern ausgleichen.
Bei meinen Tests hat der 4096 Byte Buffer immer sehr gute Werte geliefert, ab und zu sind größere Buffer etwas schneller,
teilweise aber auch langsamer ...
Gruß
Hubert
Hubert
- Markus Walter
- Programmier-Gott
- Beiträge: 1018
- Registriert: Di, 24. Jan 2006 10:22
- Wohnort: Saarland
Re: FRead() wo liegt da das Ende?
Sowohl fread, als auch freadstr verschieben den Zeiger automatisch. freadstr bricht aber den Lesevorgang bei einem chr(0) ab, was fread nicht tut.Manfred hat geschrieben:Hm,
dann habe ich irgendwas falsch interpretiert. Ich war der Meinung ich müßte immer neu positionieren, weil ich ja nicht immer bis zum Endezeichen lese.
Gruß
Markus
Mitglied der XUG Saarland-Pfalz
Markus
Mitglied der XUG Saarland-Pfalz
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: FRead() wo liegt da das Ende?
Das ist mir alles schon klar, aber ich springe doch über den gewünschten Punkt hinaus und lese weiter als ich eigentlich müßte.
Ich werde mir das nochmal genau im Debugger ansehen, ich denke da habe ich irgendwas in den falschen Hals gekriegt.
Ich werde mir das nochmal genau im Debugger ansehen, ich denke da habe ich irgendwas in den falschen Hals gekriegt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Herbert
- Der Entwickler von "Deep Thought"
- Beiträge: 1991
- Registriert: Do, 14. Aug 2008 0:22
- Wohnort: Gmunden am Traunsee, Österreich
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: FRead() wo liegt da das Ende?
Manfred, liest du denn wirklich unsere Einträge?Herbert hat geschrieben: Und wieso machst du ein Fseek? Das fread positioniert den Pointer von selbst.
Grüsse Herbert
Immer in Bewegung...
Immer in Bewegung...
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: FRead() wo liegt da das Ende?
Herbert,
doch ich lese eure Einträge. Aber lesen heißt nicht immer gleich verstehen.
doch ich lese eure Einträge. Aber lesen heißt nicht immer gleich verstehen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: FRead() wo liegt da das Ende?
Nochmals für MANFRED
Ich zerhacke die Datei immer in 4096 Byte Stücke, diese Stücke werden beim ersten Aufruf aus
1. Datensatz | 2. Datensatz | ... X. Datensatz ANFANG
beim nächsten Aufruf wird fast immer (außer du forderst genau ein vielfaches der fixen Satzlänge) der Rest des letzen Datensatzes und so weiter stehen...
X. Datensatz ENDE | X+1. Datensatz | X+2. Datensatz | ... Y. Datensatz ANFANG ....
irgendwann kommt dann ...
Y. Datensatz ENDE | Y+1. Datensatz | Y+2. Datensatz | ... Letzer Datensatz
Im Buffer suchst du beim ersten mal also einfach den ersten Datensatz, nimmst den und machst auf den Rest ein substr() ...
danach immer den Rest + neuer buffer und wieder verarbeiten solange was da ist.
Die Zuordnung wird in relativ kurzen Strings erledigt (max 4 KB ) und geht daher recht schnell.
Solltest du eine feste Satzlänge haben könntest du natürlich immer so wenige Daten anfordern, aber das wäre viel langsamer.
Ich zerhacke die Datei immer in 4096 Byte Stücke, diese Stücke werden beim ersten Aufruf aus
1. Datensatz | 2. Datensatz | ... X. Datensatz ANFANG
beim nächsten Aufruf wird fast immer (außer du forderst genau ein vielfaches der fixen Satzlänge) der Rest des letzen Datensatzes und so weiter stehen...
X. Datensatz ENDE | X+1. Datensatz | X+2. Datensatz | ... Y. Datensatz ANFANG ....
irgendwann kommt dann ...
Y. Datensatz ENDE | Y+1. Datensatz | Y+2. Datensatz | ... Letzer Datensatz
Im Buffer suchst du beim ersten mal also einfach den ersten Datensatz, nimmst den und machst auf den Rest ein substr() ...
danach immer den Rest + neuer buffer und wieder verarbeiten solange was da ist.
Die Zuordnung wird in relativ kurzen Strings erledigt (max 4 KB ) und geht daher recht schnell.
Solltest du eine feste Satzlänge haben könntest du natürlich immer so wenige Daten anfordern, aber das wäre viel langsamer.
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: FRead() wo liegt da das Ende?
Jimmy,
nicht wirklich. Mal sehen warum ich das gemacht habe.
nicht wirklich. Mal sehen warum ich das gemacht habe.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: FRead() wo liegt da das Ende?
ich verwende ja die "vorhandenen" Demo Function (siehe FSeek() ) sodie "Schleife" und die "Verarbeitung" trenne ich gerne um es "universell" verwenden zu können.
Code: Alles auswählen
aFile := F_Use( cFile ) // Datei öffnen
F_GoBottom( aFile )
nLengh := aFile[ F_POS ]
F_GoTop( aFile )
DO WHILE ! F_Eof( aFile )
cBuffer := F_Read( aFile, nMaxBuff )
nPointer := AT(CRLF,cBuffer, nLastPos) // hier CRLF als "Trenner"
cBuffer := SUBSTR(cBuffer,1,nPointer)
//re-positionieren
nLastPos := FSeek( aFile[F_HANDLE], nLastPos+nPointer+1 , FS_SET )
aFile[F_POS] := nLastPos
Tumalwas(cBuffer,aText)
// ist das Ende erreicht ?
IF aFile[F_POS] >= aFile[F_LASTREC]
EXIT
ENDIF
ENDDO
FClose( aFile[F_HANDLE] )
gruss by OHR
Jimmy
Jimmy
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: FRead() wo liegt da das Ende?
So wie es jetzt aussieht, steht mal wieder an irgendeiner Stelle "Schrott". Wie ich diese Textdatei hasse.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Re: FRead() wo liegt da das Ende?
Hallo Manfred
Die Funktion FSeek( <nHandle>, <nOffset>, [<nOrigin>] ) und damit auch FRead etc.
kann nur bis zu einem nOffset von 2147483648 betrieben werden.
Eine grössere Datei kann daher nicht vernünftig verarbeitet werden.
Man müsste dazu auf ein 64Bit API gehen.
Gruss Paul
Die Funktion FSeek( <nHandle>, <nOffset>, [<nOrigin>] ) und damit auch FRead etc.
kann nur bis zu einem nOffset von 2147483648 betrieben werden.
Eine grössere Datei kann daher nicht vernünftig verarbeitet werden.
Man müsste dazu auf ein 64Bit API gehen.
Gruss Paul
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: FRead() wo liegt da das Ende?
Solange man sequenziell einliest oder schreibt (wie ich in meinem Beispiel oben) ist das kein Problem !Paul Brem hat geschrieben:Eine grössere Datei kann daher nicht vernünftig verarbeitet werden.
Man müsste dazu auf ein 64Bit API gehen.
Gruß
Hubert
Hubert