Jason. Cała informatyka w jednym miejscu!

Przed nami dwa ostatnie wpisy o obsłudze plików dla początkujących ;). Demonstracja jaka zostanie tu ukazana będzie jakby powtórką dwóch poprzednich tematów, tylko w stosunku do plików binarnych (trudnych do odczytu i modyfikacji przy klasycznym podejściu "notatnikowym"). Zaczynając od zapisu jak zawsze, oto klasa "BinaryWriter" w języku C# i zapis danych do pliku binarnego!

"BINARYWRITER" W JĘZYKU C# RÓŻNI SIĘ TYLKO JEDNĄ RZECZĄ...

...i to jest binarny format zapisu, o czym już wspomniałem we wprowadzeniu. Cały przebieg manipulowania danymi jakie mają się znaleźć w pliku jak i samym plikiem, jest identyczny względem klasy "StreamWriter". Pozostaje więc Was tam odesłać i zachęcić do przeczytania, jeśli drapiecie się po głowie co mam na myśli :).

METODY KLASY "BINARYWRITER"

Było rzeczą łatwą do przewidzenia, że jak w poprzednim artykule było zestawienie tabelaryczne metod, dwa artykuły temu było takie same, to w tym artykule także się pojawi :). Przed Wami parę sztuk jakie znalazłem w książeczce:

NAZWA ZNACZENIE
Close Zamknięcie strumienia (bardzo ważnym jest, żeby ZAWSZE na końcu wywołać tę metodę; inaczej plik może się nie ukazać w katalogu i nie będzie możliwe wykonywanie na nim operacji!).
Flush Czyszczenie wszystkich buforów i zapis danych bufora do pliku.
Seek Ustawienie pozycji w strumieniu.
Write Zapis danych do strumienia (przeciążenia tej metody pozwalają na wprowadzenie dowolnego typu prostego).

 

PRZYKŁAD KODU ŹRÓDŁOWEGO

Na deser jak zawsze serwuję dla Was przykład użycia jak działa "BinaryWriter" w języku C# i zamykamy temat:

string filename = "data.bin";
FileStream fs = new FileStream(filename, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);

for (char c = 'A'; c <= 'Z'; ++c)
{
	bw.Write(c);
}

for (int i = 1; i <= 100; ++i)
{
	bw.Write(i);
}

bw.Close();

Standard. Na początku określenie nazwy pliku z rozszerzeniem (w tym wypadku dałem ".bin", bo z reguły tak się oznacza pliki binarne, ale nie stanowi to wymagania), potem obiekt "FileStream", następnie instancja "BinaryWriter" w języku C# i zapis dowolnych danych. Teraz dałem dwie pętle "for" o odmiennych typach danych, bo przyda się to do ułatwienia Wam zrozumienia działania. Na końcu wywołujemy metodę "Close", aby "ogłosić" programowi, że plik już został obsłużony.

Przy okazji spróbuję Was zainteresować wynikiem na wyjściu. Oto co ukazało się u mnie w "Visual Studio Code":

Zawartość pliku binarnego po użyciu klasy "BinaryWriter" w języku C#

Zawartości pliku binarnego po użyciu klasy "BinaryWriter" w języku C# ("Visual Studio Code").

Gdybyście byli ciekawi jaki tu panuje mechanizm, to opiszę krótko "na chłopski rozum". "BinaryWriter" zapisuje informacje w układzie czterobajtowym. Kiedy ma dojść do wstawienia liczby 51, to obiekt nie umieszcza liczby 51 w postaci łańcucha znaków jak "StreamWriter", tylko konwertuje ją na system binarny i zawsze o długości 32 bitów. W takiej postaci dana trafia na swoje miejsce. Otwierając otrzymany plik w notatniku lub w dowolnym innym edytorze tekstowym zobaczymy raczej znaki zamiast liczb. To dlatego na samym początku widzimy kompletny "nietknięty" alfabet (zgodność z typem "char"), a pomiędzy oznaczeniami NUL występują pojedyncze znaki zamiast liczb całkowitych (a obowiązywał typ "int"). Znaki wyświetlane w programie zgadzają się z tabelką kodów ASCII, więc podstawcie sobie znak do liczby, zanim zaczniecie się pytać retorycznie dlaczego pojawia się taki znak, a nie inny :P.

Jasne jest, że nie da się z tym niczego sensownego zrobić. Chyba, że usunąć, lecz to daleko odbiega od działania rozsądnego :D. Można też spróbować odczytać i to zadanie spadnie na podobną klasę, "StreamReader" - dalszy ciąg w następnej części :).

Klasa "BinaryWriter" w języku C#

Instancja klasy "BinaryWriter" zapisuje dane do pliku, po skonwertowaniu na system dwójkowy. Każda komórka z danymi otrzymuje cztery bajty.


Jak może brzmieć podsumowanie? "BinaryWriter" w języku C# funkcjonuje w kodzie identycznie jak "StreamWriter". Różnica wystaje dopiero na wyjściu, kiedy to poprzednik zostawia wszystkie dane na widoku, a "BinaryWriter" koduje binarnie.

PODOBNE ARTYKUŁY