[Delphi] BlockRead & BlockWrite

0

Pochwalony!
Mam problema :). Czytałem sobie PEWNĄ książkę o Object Pascal'u i natrafiłem na polecenia BlockRead i BlockWrite. Opis ich był dosyć duży, lecz mój mózg do nie skumał :). I teraz moje pytanko: Czy mógłbyś w miare swoich możliwości mi wyjaśnić te procedurki, najdokładniej jak tylko potrafisz?? (Tak, aby dziecko z Chin nieumiące mówić zrozumiało :P )?? A góry bardzo wielkie DZIĘKUJĘ

0

Na tej stronie masz w gotowcach o kopiowaniu plików z udziałem BlockWrite i BlockRead poszukaj tam. [cygaro]

0

Sorki, ja już i to czytałem, i kilka osób mi tłumaczyło i teraz w książce czytałem... :):):) i nie mogę tego skumać :P

0

spytaj się my_nick (to mój kolega z budy)

[email protected]

0

Procedury służą do odczytu/zapisu wiekszej liczby rekordów z pliku za jednym razem.

BlockRead (F, Dokad, IleRekordow, IleSieUdalo);

F to plik - albo nietypowany albo typowany (wbrew temu co pisza w helpie do Delphi)
Dokad - dokad wsadzic odczytane dane
IleRekordow - liczba rekordow (rozmiar rekordu w bajtach wynika z typu dla plikow typowanych, badz z wartosci podanej przy Reset dla plikow nietypowanych)
IleSieUdalo - w tej zmiennej procedura zwraca ile rekordow udalo sie odczytac. Mozna ja pominac, ale wtedy jesli nie uda sie odczytac Ile rekordow (np bo plik jest mniejszy), program wyrzuci blad. Jesli sie zmiennej nie pominie, wtedy program odczyta tyle rekordow ile sie da i zwroci ile sie udalo w IleSieUdalo.

BlockWrite tak samo, tylko zapisuje do pliku.

Te procedury swietnie sie nadaja do odczytu/zapisu danych w tablicach, zwlaszcza dynamicznych. Np masz program w ktorym trzymasz ile pieniedzy sa Ci winni kumple.

Robisz typ rekordowy

type TDlug = packed record
Imie : string[20];
Dlug : Cardinal; //nie bawimy sie w grosze :)))
end;

var
TablicaDlugow : array of TDlug;
F : file of TDlug;
i w programie zapisujesz dlugi do pliku

Assign(F, 'dlugi.dat');
Rewrite(F);
BlockWrite(F, TablicaDlugow[0], Length(TablicaDlugow);
CloseFile(F);

A odczytujesz tak:

Assign(F, 'dlugi.dat');
Reset(F);
SetLength(TablicaDlugow, FileSize(F));
BlockRead(F, TablicaDlugow[0], FileSize(F));
CloseFile(F);

Nie uzylem IleSieUdalo bo przy zapisie raczej nie bedzie bledu (chyba ze dysk sie skonczy :)) ) a przy odczycie odczytywane jest tyle rekorodow ile jest w pliku (FileSize(F)), wiec nie bedzie bledu.

Zwroc uwage, ze w BlockRead/Write pisze TablicaDlugow[0] a nie po prostu TablicaDlugow. Jesli zmienna Dokad jest tablica dynamiczna lub (dlugim) stringiem, wtedy nalezy koniecznie podac indeks, inaczej program sie wywali dajac nieudokumentowany w helpie blad i jest klopot. Nawet jesli zapis/odczyt jest od samego poczatku lancucha czy tablicy, trzeba pisac Lancuch[1] lub Tablica[0].

Inne przyklady (odczyt/zapis pliku Wave):
http://www.4programmers.net/forum/viewtopic.php?id=4390

www.kusmierek.republika.pl, sciagnij zrodlo programu Generator.

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