|
Wpisał doctor
|
|
Piątek, 26. Styczeń 2007 10:59 |
|
Klasa TFileStream
Klasa ta jest często wykorzystywana do obsługi plików binarnych. Stosuje się ją zamiast przestarzałych funkcji z biblioteki iostream.h. Obsługa tej klasy jest bardzo prosta. Pamiętać jedynie należy, że dostać się do pliku można jak do tablicy. Tj. należy ustawić indeks na start (od tego miejsca będziemy czytać/zapisywać). Potem należy odczytać/zapisać określoną liczbę bajtów. {viewonly=registered} Utworzenie obiektu klasy TFileStream TFileStream *Plik = new TFileStream("nazwa_pliku", tryb_otwarcia);
tryb_otwarcia określa, czy plik ma być do odczytu, do zapisu, czy ma być utworzony jeżeli nie istnieje.
Możliwe są następujące tryby otwarcia: fmOpenRead - otwarcie tylko z prawami do odczytu pliku fmOpenReadWrite - otwarcie do zapisu i odczytu fmOpenWrite - tylko dla zapisu fmCreate - plik jest tworzony, nawet jak istnieje - wtedy jego zawartość jest czyszczona fmShareCompat - nie zalecane dla wieloplatformowych aplikacji fmShareExclusive - bez prawa do odczytu i zapisu przez inne procesy fmShareDenyWrite - bez prawa do zapisu przez inne procesy fmShareDenyRead - bez prawa do odczytu przez inne procesy fmShareDenyNone - pełny dostęp dla innych procesów
Metody skojarzone z klasą TFileStream: Seek(offset, od_jakiego_miejsca) - ustawia wskaĽnik pliku Read(void *, ilosc_bajtów_do_odczytu) - do odczytu Write(void *, ilosc_bajtów_do_zapisu) - do zapisu
parametr od_jakiego miejsca najczęściej przyjmuje wartość soFromBeginning - od początku pliku.
Jeśli obiekt klasy TFIleStream jest tworzony dynamicznie (a więc przez wskaĽnik), należy pamiętać nie tylko o usunięciu wskaĽnika po skończonej operacji operatorem delete, ale także o zwolnieniu zasobów za pomocą funkcji Free().Powyższa uwaga jest bardzo ważna.Może się zdarzyć, że będziemy korzystać w programie kilka razy z tego samego pliku.Jeśli po każdej operacji nie zwolnimy zasobów za pomocą funkcji Free(), to ujrzymy komunikat 'Cannont open file ...'.Jest to pokazane na poniższym przykładzie.Niestosowanie tej praktyki może prowadzić do błędów współdzielenia plików, wycieku pamięci itd.
Przykład Zapis liczb z przedziału od 0 do 255 do plilu
TFileStream *str = new TFileStream("zapis.txt", fmCreate);
char *buf;
for(int i=0;i<256;i++)
{
str->Seek(i, soFromBeginning);
buf = (char*)i;
str->Write(&buf, 1); //zapis 1B
}
str->Free(); delete str; |
Odczyt zawartości pliku "zapis.txt"
if(FileExists("zapis.txt")) { //sprawdzenie czy plik istnieje TFileStream *str2 = new TFileStream("zapis.txt", fmOpenRead); int rozmiar_pliku = str2->Size; // w B unsigned char buf; for(int i=0;i<rozmiar_pliku;i++) { str2->Seek(i, soFromBeginning); str2->Read(&buf, 1); // odczyt 1B Chart1->Series[0]->AddY(buf); } }
|
Klasa obsługuje pliki o rozmiarze 2^64 bajtów.{/viewonly}
|
|
LAST_UPDATED2 |