[delphi] Wczytywanie pliku

0

Witam!

Mam taki problem. Pisze program, który ma wczytywać duże pliki i wyszukiwać w nich pewne informacje. Pliki są duże, dlatego nie mogę ich wczytywać całych na raz, tylko fragmentami.

Mam też gotową klasę, która służy do wyszukiwania - ale oczekuje jako argument zmiennej typu STRING.

I teraz jak te dwie rzeczy połączyć.

Jak zrobić SZYBKIE czytanie pliku do STRINGA?

Ja używam BlockRead. Bo jest bardzo szybkie. Ale BlockRead nie może czytać do stringa tylko do jakiegoś buforu. Więc zrobiłem zmienną Bufor : array[0..1024] of Byte i do niej wczytuje. I takie czytanie pliku jest bardzo szybkie. No, ale ja potrzebuje tych wczytanych danych w zmiennej string. Więc robie tak:

S:='';
for i:=1 to Wczytano do S:=S+Chr(Bufor[i-1]);

czyli tworze stringa na podstawie bufora. I to działa. Ale te dwie powyższe linijki spowalniają cały program ze 100 razy! ;)

Czyli generalnie pytanie - jak najszbciej zamienić tablice (jak podałem wyżej) na ciąg znaków STRING... albo inaczej - jak wczytywać dane od razu do STRINGa.

Bo można do STRING'a wczytywać tak:

ReadLn(Plik,S);

ale tutaj nie kontroluje po ile bajtów... i wczytuje "liniami", a ja chcę operować na plikach binarnych, nie tylko tekstowych. Mam nadzieję, ze rozumiecie.

Z góry dzięki za pomoc

0

ech to po co operujesz na String jak mzoesz operowac na tablicy char sa od tego odpowiednie funkcje nie widze sensu zamieniac lancuch char na string ;)

0

zmiana tablicy na stringa:

Copy(a,Low(a),High(a));

gdzie

a : array [0..1023] fo char

funkcja zwraca stringa.
Jeszcze prosciej jezeli bedziesz pamietal zeby przypisac ostatniemu elementowi NULL to

String(@a[0])

.
Z reszta nie widze powodu dla ktorego przeksztalcac tablice na string.

0

Chodzi o to, że ja mam gotową klasę do szukania (korzysta z wyrażeń regularnych) i ONA potrzebuje stringa. Nie znam się na tyle, by napisać taką klase samodzielnie. A zatem muszę z niej korzystać. Ponieważ ona oczekuje STRINGA muszę jej stringa dać ;) A nie umiałem szybko czytać do stringów.

Podane sposoby zaraz sprawdzę. Tylko wydawało mi się, że String to nie jest po prostu ciąg znaków... i że nie można odwoływać się do niego przez pobranie adresu małpką. Myślałem, że wewnętrznie jest to bardziej rozbudowana struktura. No ale spróbuję.

0
kemilek1982 napisał(a)

A nie umiałem szybko czytać do stringów.

Aaaaa! Tyle razy było!

F:file;
s:string;
begin
 AssignFile(F,'nazwa.txt');
 Reset(F,1);
 SetLength(s,FileSize(F)); //lub inaczej wyznaczona dlugosc do wczytania
 BlockRead(F,s[1],Length(s)); // lub ,FileSize(F)); jesli czytasz caly plik
 CloseFile(F);

do tablic dynamicznych czyta sie tak samo, tylko F: file of Typ_tablicy, Reset(F) i BlockRead(F, tablica[0],

1 użytkowników online, w tym zalogowanych: 0, gości: 1