Katedra Informatyki Stosowanej PŁ
dr inż. Anna Fabijańska
Podstawy Programowania
Laboratorium 3
Zadanie 1:
Zawartość dowolnego pliku tekstowego wyświetlić na konsoli. Ścieżkę dostępu
do pliku należy pobrać od użytkownika.
Zadanie 2:
Napisać funkcję do obliczania rozmiaru plików. Jako argument funkcja powinna
przyjmować ścieżkę dostępu lub wskaźnik do pliku.
Zadanie 3:
Napisać program do kopiowania plików tekstowych. Program powinien
oczekiwać na podanie ścieżki dostępu do pliku źródłowego i pliku docelowego.
Zadanie 4:
Zmodyfikować program z Zadania 3 tak, aby kopiowanie odbywało się od
końca pliku (ostatni znak pliku źródłowego powinien być pierwszym znakiem
pliku docelowego). W programie umieścić funkcję kopiującą, przyjmującą jako
argumenty ścieżki do plików: źródłowego i docelowego.
Zadanie 5:
Dana jest funkcja postaci:
≥
−
≤
+
<
<
+
+
+
≤
<
−
=
10
lub
1
5
10
0
)
2
)(
1
(
3
0
1
sin
2
)
(
2
2
x
x
dla
x
x
dla
x
x
x
x
x
dla
x
x
f
Napisać program, do tablicowania powyższej funkcji na przedziale
>
<
b
a,
podanym przez użytkownika. Wyniki należy zapisać do pliku w dwóch
kolumnach.
Zadanie dodatkowe
Napisać program do kopiowania plików w formacie *.bmp.
Funkcje potrzebne do wykonania zadań:
fopen()
,
fclose()
,
fprintf()
,
fscanf()
,
fread()
,
fwrite()
,
fseek()
,
ftell()
,
feof(), putc(),
getc()
. Plik nagłówkowy:
stdio.h
Katedra Informatyki Stosowanej PŁ
dr inż. Anna Fabijańska
Opis formatu BMP
BMP jest jednym z formatów plików danych z grafiką bitmapową. Opracowany
pierwotnie jako natywny dla systemu OS/2, wykorzystywany później także w interfejsach
systemów z rodziny Microsoft Windows, jednak dostępny jako format przechowywania danych
również na wszystkich pozostałych platformach. Zawiera w sobie prostą kompresje bezstratną
RLE (która nie musi być użyta) oraz informację o użytych kolorach. Obsługuje tylko tryb RGB.
Rys.1. Struktura bitmapy
Plik w formacie BMP składa się z następujących elementów (rys. 1):
•
nagłówek pliku;
•
nagłówek obrazu;
•
opcjonalnie paleta RGB (tablica kolorów);
•
dane obrazowe.
Nagłówek pliku, stanowi struktura BITMAPFILEHEADER (Tabela 1), która spełnia rolę
sygnatury identyfikującej format pliku.
Tabela 1. Budowa nagłówka bitmapy.
Nazwa
Rozmiar (bajty)
Opis
bfType
2
Sygnatura pliku, zawsze przyjmuje wartość BM
bfSize
4
Długość całego pliku w bajtach
bfReserved1
2
Pole zarezerwowane zwykle ma wartość 0
bfReserved2
2
Pole zarezerwowane zwykle ma wartość 0
bfOffBits
4
Pozycja danych obrazowych w pliku
Bezpośrednio po nagłówku następuje nagłówek obrazu. W przypadku formatu
kompatybilnego rodziną systemów Windows, stanowi go struktura BITMAPINFOHEADER
(Tabela 2).
Tabela 2 Budowa nagłówka bitmapy.
Nazwa
Rozmiar (bajty)
Opis
biSize
4
Wielkość nagłówka informacyjnego
biWidth
4
Szerokość obrazu pikselach
biHeight
4
Wysokość obrazu w pikselach
biPlanes
2
Liczba płatów (musi być 1)
biBitCount
2
Liczba bitów na piksel: 1,4,8,16,24 lub 32
biCompression
4
Algorytm kompresji: BI_RGB=0, BI_RLE8=1, BI_RLE4=2, BI_BITFIELDS=3
biSizeImage
4
Rozmiar samego rysunku
biXpelsPerMeter
4
Rozdzielczość pozioma
biYpelsPerMeter
4
Rozdzielczość pionowa
biCrlUses
4
Liczba kolorów w palecie
biCrlImportant
4
Liczba ważnych kolorów w palecie.
Katedra Informatyki Stosowanej PŁ
dr inż. Anna Fabijańska
Paleta (tablica) kolorów występuje bezpośrednio po części nagłówkowej (zazwyczaj
zajmującej łącznie 54 bity), a jej format zależy od typu bitmapy, tj. od ilości bitów,
przeznaczonych do zakodowania jednego piksela. W przypadku bitmap 1, 4 i 8 bitowych,
kompatybilnych z systemami z rodziny Windows, paletę barw stanowi 2
bpp
– elementowa
tablica struktur RGBQUAD postaci:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;}
RGBQUAD;
Wartość piksela jest indeksem elementu palety barw, opisującej za pomocą trójki
składowych RGB jego kolor.
Wynikowy kolor nie zawsze jednak jest kolorem wynikającym z mapowania pikseli. W
przypadku bitmap 16 i 32 bitowych, z wartością pola biCompression w strukturze
BITMAPINFOHEADER ustawioną na BI_BTFIELDS, w miejscu tablicy struktur RGBQUAD,
występuje tablica trzech, czterobajtowych liczb całkowitych. Te trzy wartości są maskami,
określającymi bity określające odpowiednio wartości RGB.
Obrazy 24 – bitowe, jak również 16, i 32 - bitowe, w których nagłówku pole
biCompression ma wartość różną od BI_BITFIELDS nie posiadają palety barw.
Ostatnim komponentem plików w formacie BMP są dane obrazowe, czyli piksele. Ich
położenie w stosunku do końca struktury BITMAPFILEHEADER, określone jest wartością pola
bfOffBits w nagłówku pliku.
Piksele ułożone są rzędami w kolejności od dołu do góry. Ilość rzędów, jak również
pikseli w rzędzie określona jest odpowiednio wartościami pól biHeight oraz biWidth. Rozmiar
rzędu jest zdeterminowany przez wartości pól biBitCount i biWidth. Ilość pikseli w jednym
rzędzie jest zaokrąglana do najbliższej całkowitej wielokrotności liczby 4.
Format danych obrazowych zależy od ilości bitów przeznaczonych do zakodowania
jednego piksela:
•
1 bpp
bajt jest dzielony na 8 części, (po jednym bicie) przy czym wartość z każdej części jest
indeksem do elementu w palecie barw;
•
4 bpp
bajt jest dzielony na 2 części, (po cztery bity) przy czym wartość z każdej części jest
indeksem do elementu w palecie barw;
•
8 bpp
każdy piksel jest reprezentowany przez 1 bajt, którego wartość jest indeksem do elementu
w palecie barw;
•
16 bpp
każdy piksel jest reprezentowany przez 2-bajtową liczbę całkowitą. Jeśli wartość pola
biCompression
w
nagłówku
BITMAPINFOHEADER
posiada
wartość
BI_RGB
(0),
intensywność każdego koloru, jest reprezentowana przez 5 bitów (nieużywany jest wtedy
bit najbardziej znaczący); jeżeli natomiast wartość pola biCompression ustawiona jest na
BI_BITMAP, 4- bajtowe maski bitowe, określają wartości każdego z komponentów RGB;
•
24 bpp
każdy piksel opisany jest poprzez 3 kolejne bajty, określające kolejno wartości składowych
RGB (odwrotnie niż w większości formatów graficznych);
•
32 bpp
każdy piksel reprezentowany jest przez 4 – bajtową liczbę całkowitą analogicznie jak
w przypadku bitmap 24 bitowych, z dodatkowym niewykorzystanym bajtem na końcu.