abrakadaber napisał(a)
nie da się tak - po odczytaniu i zmodyfikowaniu linii zapisz ją do nowego pliku.
Nie do końca, ale mniej więcej jest to prawda;
To co wiem że możesz zrobić to zastosować klasę TFileStream - wczytać łańcuch do zmiennej, zmodyfikować go, po czym przesunąć kursor strumienia w dół o ilość znaków łańcucha i tam wpisać nowy łańcuch np. metodą WriteBuffer
; Dzięki temu faktycznie nadpiszesz istniejące dane;
Niestety w praktyce nie jest to takie proste, a ponadto ma swoje ograniczenia; Z tego co wiem klasa ta nie ma metody umożliwiającej wczytanie linii znaków do napotkania sekwencji CRLF
, więc nie wiadomo ile znaków ma aktualna linia (nie ma odpowiednika procedury Readln); Po drugie aby możliwe było prawidłowe nadpisanie danej linii w pliku, długości starej i nowej wersji linii muszą być takie same - jeśli wczytana linia ma 10
znaków, to po modyfikacji musi mieć także 10
znaków, aby nadpisanie było prawidłowe;
Mały przykład - mając plik o poniższej zawartości:
000
111
222
333
i wywołując poniższy kod:
const
BUFF_SIZE = 3;
var
fsInput: TFileStream;
arrBuffer: TByteDynArray;
begin
fsInput := TFileStream.Create('C:\foo.txt', fmOpenReadWrite or fmShareExclusive);
try
SetLength(arrBuffer, BUFF_SIZE);
fsInput.ReadBuffer(arrBuffer[0], BUFF_SIZE);
FillChar(arrBuffer[0], BUFF_SIZE, 65);
fsInput.Seek(-BUFF_SIZE, soFromCurrent);
fsInput.Write(arrBuffer[0], BUFF_SIZE);
finally
fsInput.Free();
end;
end.
pierwsza linia pliku zostanie wypełniona znakami o kodzie 65
, czyli A
; Zawartość pliku po wykonaniu programu:
AAA
111
222
333
Jednak tak jak napisałem wcześniej - zbyt wąskie możliwości ma taki sposób, więc najlepszym rozwiązaniem będzie albo przepisywanie linia po linii do nowego pliku, albo wczytanie pliku do pamięci, przerobienie go i zapisanie z powrotem do tego samego pliku;
nieznany napisał(a)
Rozumiem, dziękuję za odpowiedź. Zmodyfikowałem kod. Czy jest dobrze?
Jest dobrze, ale wypadałoby dodać bloki Try Finally.