Grundsätzlich kann man in einer Textdatei (fopen(), fwrite() etc.) nichts einfügen, sondern nur neu schreiben oder anhängen.
ABER so macht man das auch nicht
Entweder man liest sie per MEMOREAD() ein, ändert im String was man will und schreibt mit lMemoWrite() von ot4xb oder mit Str2Disk() den neuen Inhalt weg.
Code: Alles auswählen
*---------------------------------------------------------------------------------------------
function Str2Disk(cFile,cTxt) // memowrit() fügt ein chr(26) an die Datei an, was stört !
local nResult, nHandle, nByte
nResult := 0 // wird schon alles gut gehen ...
nHandle := FCreate(cFile)
if nHandle = -1
nResult := FError()
else
nByte := FWrite( nHandle, cTxt )
if len(cTxt) # nByte
nResult := FError()
endif
endif
FClose(nHandle)
return nResult
http://www.xbaseforum.de/viewtopic.php?f=16&t=1811
MemoWrit() von Xbase++ ist NICHT geeignet, da es ein chr(26) anhängt.
Wenn du die Datei immer zeilenweise bearbeiten willst, ist das Umschaufeln in ein Array sinnvoll, da man da Zeilen entfernen und einfügen kann.
Nach der Bearbeitung wird dann das Array wieder weggeschrieben:
Code: Alles auswählen
set alternate to TextDatei.txt
set alternate on
set console off // bei GUI sehr wichtig
aeval(aZeilen,{|cZeile| qout(cZeile)})
set alternate to
oder
cTxt := ""
aeval(aZeilen,{|cZeile| cTxt += cZeile + chr(13) + chr(10) })
lMemoWrite("TextDatei.txt",cTxt)
cTxt := NIL
http://www.xbaseforum.de/viewtopic.php?f=16&t=4268
Fürs Einlesen einer TXT Datei in ein Array nutze ich diese Funktion:
Code: Alles auswählen
*-------------------------------------------------------------------------------
FUNCTION TxtFile2Array(cDateiName,cConvert) // TXT einlesen und zeilenweise in Array einlesen
// cConvert: NIL / empty - nichts tun
// O2A - Oem 2 Ansi
// A2O - Ansi 2 Oem
local cDateiInhalt, aZeilen := {}, nVon, nBis, cTxt
DEFAULT cConvert to ""
nVon := 1
nBis := 0
if file(cDateiName)
cDateiInhalt := memoread(cDateiName)
if ! empty(cDateiInhalt)
cConvert := upper(alltrim(cConvert))
do case
case cConvert == "O2A"
cDateiInhalt := ConvToAnsiCP(cDateiInhalt)
case cConvert == "A2O"
cDateiInhalt := ConvToOemCP(cDateiInhalt)
endcase
do while .t.
nBis := at(CRLF,cDateiInhalt,nVon)
if nBis = 0 // Ende der Datei wurde erreicht, letzten Satz nicht vergessen
cTxt := substr(cDateiInhalt,nVon)
nVon := len(cDateiInhalt)+1
else
cTxt := substr(cDateiInhalt,nVon,nBis-nVon)
nVon := nBis+2
endif
cTxt := strTran(cTxt,CRLF,"") // entferne die CRLF am Zeilenende
aadd(aZeilen,cTxt)
if nVon > len(cDateiInhalt)
exit
endif
enddo
endif
endif
return aZeilen
Du kannst dir die funktion natürlich mit fopen(), fread() und fwrite() auch selbst bauen. Hierzu zunächst den Rest einlesen, den neuen Text mit dem Rest vereinen und an der gewünschten Stelle mit dem Rest zusammen wieder wegschreiben (dabei wird der alte Inhalt überschrieben), wenn du aber die Datei kürzen willst, dann weiß ich nicht ob das so funktioniert.
Aus Geschwindigkeitsgründen ist memoread() und lMemoWrite() / String2Disk() weit überlegen, da es die Platten nur kurz nutzt und von der Bedienung einfacher ist.
Strings von vielen MB sind ab WinNT kein Problem mehr, solange genug RAM im Rechner ist.