Biblioteki standardowe C++ stanowią zestaw funkcji, stałych, zmiennych, klas i obiektów, które rozszerzają podstawowe możliwości języka, umożliwiając wykonanie wielu operacji systemowych oraz korzystanie z funkcji napisowych, matematycznych i innych bez konieczności tworzenia własnych algorytmów. Znacznie też ułatwiają przenośność programów miedzy różnymi systemami: podstawowa składnia języka jest niezależna od systemu, a dołączenie podczas kompilacji bibliotek standardowych z innego systemu umożliwia bezproblemowe uruchomienie programu na każdym komputerze.
Poniżej znajdziesz listę wybranych - najczęściej używanych - funkcji bibliotek standardowych, stałych oraz zmiennych publiczne. Dla najistotniejszych funkcji podano też składnie i przykłady. Opisu i przykładów dla pozostałych funkcji szukaj w dokumentacji swojego środowiska C++.
Strumienie - procedury wejścia / wyjścia
Strumienie (ang.
Streams) - abstrakcyjne urządzenia używane do wprowadzania i wyprowadzania danych z programu (operacje wejścia- wyjścia). Mogą odnosić się do urządzeń znakowych (pliki, klawiatura, monitor, drukarka, porty I/O) lub binarnych (pliki dyskowe, porty I/O).
Strukturą, poprzez którą odwołujemy się do strumieni jest
FILE, struktura zawierająca informacje o właściwościach i wskaźnikach używanego pliku. Praktycznie nigdy nie odwołujemy się wprost do pól tej struktury (jest ona inna dla każdego systemu operacyjnego i kompilatora). Używamy jej wskaźnika, jako parametru w funkcjach operujących na strumieniach wejścia-wyjścia.
Właściwości
Każdy strumień posiada kilka właściwości, które są przyjmowane domyślnie ze środowiska lub definiowane podczas otwierania strumienia funkcją fopen.
- tryb dostępu (Access) - określa jakie operacje mogą być dokonywane na strumieniu: tylko odczyt, tylko zapis lub odczyt i zapis.
- tryb transmisji danych: Text / Binary - sposób odczytywania i zapisu danych:
Text - strumień składający się z wierszy zakończonych znakiem nowej linii (ang. EOL=End Of Line). Również koniec pliku jest sygnalizowany specjalnym znakiem (ang EOF=End of File).
Binary - każdy bajt strumienia jest traktowany jako dane: nie jest dokonywana żadna translacja, a koniec pliku osiągamy po odczytaniu/zapisaniu fizycznie ostatniego bajta w strumieniu.
- bufor - blok pamięci, gdzie przechowywane są dane strumienia zanim nastąpi ich fizyczny odczyt lub zapis. Bufor znacznie przyspiesza operacje wejścia-wyjścia związane z plikami i portami poprzez odczyt lub zapis większych bloków a nie pojedynczych bajtów. Strumień może nie być buforowany: wtedy odczyt i zapis kierowane są wprost do urządzenia go obsługującego. Użyciem buforów możemy sterować za pomocą funkcji setbuf i setvbuf.
Wskaźniki
Strumień posiada wskaźniki informujące o jego aktualnym stanie. Są one modyfikowane i wykorzystywane wewnątrz funkcji operujących na strumieniach:
- wskaźnik błędu (ang. Error Indicator) - jest ustawiany, gdy podczas jakiejkolwiek operacji związanej ze strumieniem wystąpi błąd. Jego wartość można sprawdzić funkcją ferror, można go też "wyczyścić" funkcją clearerr lub jedną z funkcji zmieniających położenie wewnętrznego wskaźnika pliku (rewind, fseek i fsetpos).
- wskaźnik końca pliku (ang. End-Of-File Indicator) - jest ustawiany, gdy po ostatniej operacji zapisu lub odczytu wewnętrzny wskaźnik strumienia znalazł się za ostatnim jego bajtem. Można go sprawdzić funkcją feof. Jest resetowany funkcją clearerr lub funkcją zmieniającą położenie wewnętrznego wskaźnika strumienia: rewind, fseek i fsetpos.
- wskaźnik pozycji (ang. Position Indicator lub File pointer) - wskazuje aktualną pozycję wewnątrz pliku, od której rozpocznie się następna operacja czytania lub zapisu. Można go odczytać funkcjami ftell i fgetpos lub zmienić jego położenie funkcjami rewind, fseek i fsetpos. Jeżeli wskaźnik jest ustawiony na początku pliku, to ma wartość 0.
Strumienie standardowe
Istnieją 3 standardowe strumienie otwierane automatycznie w momencie startu programu:
- stdin - standardowy strumień wejściowy. Domyślnie stdin skojarzony jest z klawiaturą, ale można go przekierować do dowolnego urządzenia lub pliku (pamiętając, że np. wczytywanie znaków z monitora lub drukarki nigdy się nie uda).
- stdout - standardowy strumień wyjściowy. Domyślnie stdout skojarzony jest z monitorem, ale można go przekierować do dowolnego urządzenia lub pliku (znowu pamiętając, że np. zapis znaków na klawiaturze nie ma sensu).
- stderr - standardowy strumień dla komunikatów o błędach. Domyślnie stderr skojarzony jest z tym samym urządzeniem co stdout (monitor), ale można go przekierować do dowolnego urządzenia lub pliku.
Funkcje wejścia-wyjścia:
clearerr | zeruje wskaźnik błędu strumienia |
fclose | zamyka strumień |
feof | sprawdza, czy osiągnięto koniec strumienia (ang. End Of File) |
ferror | sprawdza, czy wystąpił błąd w ostatniej operacji strumieniowej |
fflush | opróżnia bufor strumienia |
fgetc | wczytuje następnego znak ze strumienia |
fgetpos | odczytuje aktualną pozycję wskaźnika w strumieniu |
fgets | wczytuje łańcuch znaków ze strumienia |
fopen | otwiera strumień |
fprintf | formatowany zapis do strumienia |
fputc | zapisuje 1 znak do strumienia |
fputchar | zapisuje 1 znak do strumienia |
fputs | zapisuje łańcuch znaków do strumienia |
fread | odczytuje blok danych ze strumienia |
freopen | ponownie otwiera strumień z przekierowaniem na inny strumień |
fscanf | formatowany odczyt ze strumienia |
fseek | ustawienie wskaźnika strumienia w nowym położeniu |
fsetpos | ustawienie wskaźnika strumienia w zapamiętanym położeniu |
ftell | odczytanie aktualnej pozycji wskaźnika w strumieniu |
fwrite | zapis bloku danych do strumienia |
getc | odczytanie następnego znaku ze strumienia |
getchar | odczytanie znaku ze strumienia |
gets | odczytanie łańcucha znaków ze strumienia |
getw | odczyt następnej liczby typu int ze strumienia |
perror | wyświetlenie komunikatu błędu |
printf | formatowany zapis do strumienia |
putc | zapis znaku do strumienia |
putchar | zapis znaku do strumienia |
puts | zapis łańcucha znaków do strumienia |
putw | zapis liczby typu int do strumienia |
remove | usunięcie pliku z dysku |
rename | zmiana nazwy pliku lub katalogu |
rewind | ustawienie wskaźnika na początku strumienia |
scanf | formatowany odczyt danych ze strumienia |
setbuf | przydziela bufor dla strumienia |
setvbuf | przydziela bufor dla strumienia |
tmpfile | tworzy i otwiera plik tymczasowy |
tmpnam | generuje unikalna nazwę pliku tymczasowego |
Procedury konwersji danych
W C++ konwersja między różnymi typami numerycznymi nie stanowi większego problemu: używamy do tego operatora konwersji (typ). Jednak zamiana liczby na łańcuch znaków lub odwrotnie nie jest już takie proste. Wymaga opracowania skomplikowanych algorytmów uwzględniających typ konwertowanej liczby, jej znak, ilość miejsc po kropce dziesiętnej, a w wielu wypadkach konieczność zaokrąglenia. Z pomocą programiście przychodzą funkcje konwersji umieszczone w standardowej bibliotece C++.
Funkcje konwersji danych:
atof | konwersja zmiennej typu string na typ double |
atoi | konwersja zmiennej typu string na typ integer |
atol | konwersja zmiennej typu string na typ long |
ecvt | konwersja zmiennej typu double na typ string bez kropki dziesiętnej |
fcvt | konwersja zmiennej typu double na typ string z zaokrągleniem do określonej ilości cyfr |
gcvt | konwersja zmiennej typu double na typ string |
itoa | konwersja zmiennej typu integer na typ string |
ltoa | konwersja zmiennej typu long na typ string |
strtod | konwersja zmiennej typu string na typ double |
strtol | konwersja zmiennej typu string na typ long |
strtoul | konwersja zmiennej typu string na typ unsigned long |
ultoa | konwersja zmiennej typu unsigned long na typ string |
Operacje na łańcuchach znaków
W C++ tekst (łańcuch znaków, ang.
string) jest tablicą o elementach typu
char zakończoną znakiem o kodzie:
0 (
NULL), którą możemy deklarować wprost jako tablicę lub jako wskaźnik do takiej tablicy. Wyjaśnijmy to na przykładzie:
char str1 [11], str2 [ ] = "Pierwszy napis";
char *p_str1, *p_str2 = "Drugi napis";
p_str1 = str2;
W pierwszym wierszu utworzyliśmy zmienną
str1, która może pomieścić napis o maksymalnej długości
10 znaków (
11 zarezerwowany jest na stałą kończącą łańcuch - NULL) i zmienną
str2 z przypisaną wartością inicjującą
Pierwszy napis (wielkość tablicy wyliczy kompilator:
14 + 1 na NULL). Początkowa zawartość zmiennej
str1 jest nieokreślona, gdyż zmienna nie jest inicjowana. Drugi wiersz zawiera deklarację wskaźników do typu
char:
p_str1 - bez inicjacji i
p_str2 - zainicjowany adresem, pod którym został w pamięci umieszczony napis
Drugi napis. Trzeci wiersz inicjuje zmienną
p_str1 adresem, pod którym umieszczono w pamięci tekst
Pierwszy napis: od tej chwili
p_str1 i
str2 mogą być używane jako synonimy. Przykładowy układ tych zmiennych w pamięci:
Funkcje operujące na łańcuchach znaków:
memchr | wyszukuje znaku w buforze pamięci |
memcmp | porównuje zawartość buforów pamięci |
memcpy | kopiuje znaki miedzy buforami pamięci |
memmove | kopiuje znaki miedzy buforami pamięci |
memset | zapełnia bufor pamięci podanym znakiem |
strcat | łączy dwa łańcuchy znaków |
strchr | wyszukuje pierwszego wystąpienia znaku w łańcuchu znakowym |
strcmp | porównuje dwa łańcuchy znakowe |
strcmpi | porównuje dwa łańcuchy znakowe bez rozróżniania wielkości liter |
strcpy | kopiuje jeden łańcuch znakowy do drugiego |
strcspn | wyszukuje w łancuchu pierwszego znaku należącego do podanego podzbioru |
strerror | pobiera komunikat o błędzie |
strlen | zwraca długość łańcucha znakowego |
strncat | dołącza określoną ilość znaków z jednego łańcucha do drugiego |
strncmp | porównuje część znaków w 2 łańcuchach |
strncpy | kopiuje określoną ilość znaków z jednego łańcuchaq do drugiego |
strpbrk | wyczukuje w łańcuchu jakiegokolwiek znaku z innego łańcucha |
strrchr | wyszukuje ostatniego wystąpienia znaku w łańcuchu znakowym |
strspn | wyczukuje w łańcuchu pierwszego znaku nie należącego do innego łańcucha |
strstr | wyszukuje ciągu znaków w łańcuchu znakowym |
strtok | wyodrębnia podciągi ograniczone podanym znakiem |
Funkcje matematyczne i trygonometryczne
Jest to grupa funkcji służąca - jak wskazuje nazwa - do wykonywania obliczeń na liczbach. Funkcje te są w zasadzie proste i nie wymagają większych komentarzy. Kryje się w nich jednak pewna pułapka, o której należy pamiętać. Język C++ jest bardzo wrażliwy na zgodność typów: zarówno parametrów funkcji jak i zwracanych wartości. Dlatego dla wykonania nawet tak prostego działania, jak obliczenie modułu liczby mamy kilka funkcji. Korzystając z biblioteki matematycznej musisz zawsze pamiętać, aby wybrać tę funkcję, której typ parametrów i zwracanej wartości jest zgodny z typem zmiennych, na których operujesz.
Funkcje matematyczne:
Działanie | Typ zmiennej i wyniku | Funkcja |
moduł liczby | int long double long double | abs labs fabs fabsl |
najmniejsza liczba całkowita >= od podanej | double long double | ceil ceill |
dzielenie całkowite z resztą | int long | div ldiv |
eksponenta (ex) | double long double | exp exp |
największa liczba całkowita <= od podanej | double long double | floor floorl |
logarytm naturalny (o podstawie e) | double long double | log logl |
logarytm dziesiętny (o podstawie 10) | double long double | log10 log10l |
procedura obsługi błędów | | matherr |
zwraca większą z 2 wartości | wszystkie | max |
zwraca mniejszą z 2 wartości | wszystkie | min |
wyznaczenie wartości wielomianu | double long double | poly poly |
obliczenie dowolnej potęgi | double long double | pow pow |
obliczenie potęgi o podstawie 10 | double long double | pow10 pow10 |
generator losowych liczb całkowitych | | rand |
generator losowych liczb całkowitych | | random |
inicjuje generator liczb losowych | | randomize |
inicjuje generator liczb losowych | | srand |
pierwiastek kwadratowy liczby | double long double | sqrt sqrtl |
Funkcje trygonometryczne:
Działanie | Typ zmiennej i wyniku | Funkcja |
cosinus | double long double | cos cosl |
sinus | double long double | sin sinl |
tangens | double long double | tan tanl |
arcus cosinus | double long double | acos acosl |
arcus sinus | double long double | asin asinl |
arcus tangens | double long double | atan atanl |
cosinus hiperboliczny | double long double | cosh coshl |
sinus hiperboliczny | double long double | sinh sinhl |
tangens hiperboliczny | double long double | tanh tanhl |
Program napisany w języku C++ ma dostęp do dwóch obszarów pamięci, w których może być przechowywana zmienna ilość danych: stosu i sterty.
Na stosie przechowywane są zmienne lokalne (automatyczne). Wywołania funkcji również zostawiają ślad na stosie, aby było wiadomo, dokąd program ma powrócić po jej zakończeniu. Stos obsługiwany jest automatycznie i programista nie ma możliwości ingerencji w tą obsługę.
Drugi obszar pamięci, z którego można korzysta program, to sterta. Sterta jest obszarem pamięci udostępnianym przez system operacyjny wszystkim wykonującym się procesom. W systemach wielodostępnych istnieją zabezpieczenia, które uniemożliwiają dostęp procesu do pamięci, z której korzysta inny proces. Ponieważ wielkość sterty jest ograniczona (choć znacznie większa niż obszar stosu), więc procesy działające w systemie współzawodniczą ze sobą o dostęp do tego obszaru.
Przydziałem pamięci zajmuje się system operacyjny, może on jednak przydzielić tylko tyle pamięci ile w danej chwili jest wolne. Dlatego procesy, którym pamięć została przydzielona, powinny informować system, że z niej nie korzystają (zwalniać) natychmiast po tym jak pamięć przestaje być im potrzebna.
Do obsługi pamięci w C++ służą zmienne wskaźnikowe. Problemem jest takie napisanie programu, by nie próbował on czytać lub zapisywać pamięci, która nie została mu przydzielona (powoduje to bardzo trudne do wykrycia błędy w systemach bez ochrony pamięci lub wtedy, gdy program modyfikuje swoją pamięć, ale w nieprzewidzianym miejscu) i równocześnie zwalniał całą przydzieloną i zbędną już pamięć. Należy pamiętać, że wskaźniki, podobnie jak inne zmienne, w momencie deklaracji mają wartość nieokreśloną i programista musi zadbać, by ich wartość była sensowna.
Funkcje zarządzania pamięcią:
malloc | dynamiczne przydzielenie bloku pamięci |
calloc | alokacja pamieci dla tablicy |
realloc | ponowne przydzielenia pamięci |
free | zwolnienie dynamicznie przydzielonej pamieci |
Jest grupa funkcji służących do natychmiastowego przerwania programu, pobrania lub ustawienia zmiennych środowiskowych systemu operacyjnego i wykonywania poleceń systemowych (innych programów). Z funkcji tych korzystamy w sytuacjach awaryjnych w programie (nieokreślone błędy, niepoprawne dane, itp.) oraz wtedy, gdy musimy z programu odwołać się do systemu operacyjnego.
Funkcje kontroli procesów:
abort | awaryjne zakończenie programu |
atexit | rejestracja funkcji wykonywanej przy wyjściu z programu |
exit | zakończenie programu |
getenv | pobranie zmiennej środowiskowej systemu operacyjnego |
putenv | tworzy lub modyfikuje zmienną środowiskową systemu operacyjnego |
system | wykonuje polecenie systemowe, uruchamia inny program |
Są to funkcje współpracujące z ekranem w trybie tekstowym. Umożliwiają łatwe wyświetlanie tekstów z dowolnymi atrybutami, w dowolnym miejscu ekranu bez konieczności uciekania się do bardziej skomplikowanych algorytmów. Wszystkie podane tu funkcje wymagają dołączenia do programu pliku nagłówkowego <CONIO.H>.
Jeżeli używamy procedur trybu tekstowego i chcemy zachować atrybuty wczytywania i wyświetlania oraz pozycję aktualnego okienka, to funkcje strumieniowe wczytywania i zapisu powinniśmy zastąpić odpowiednio: cscanf - wczytywanie i cprintf - wyświetlanie. Działają one identycznie jak scanf i printf, ale - w odróżnieniu od nich - zachowują wszystkie atrybuty grafiki ekranowej.
Współrzędne ekranu i okienek liczone są zawsze od punktu o współrzędnych (1, 1), który znajduje się w górnym lewym rogu ekranu (okienka).
Jako kolorów tekstu i tła możesz używać jednej z podanych niżej wartości numerycznych lub symboli:
Wartość numeryczna | Wartość symboliczna | Kolor tekstu | Kolor tła |
0 | BLACK | tak | tak |
1 | BLUE | tak | tak |
2 | GREEN | tak | tak |
3 | CYAN | tak | tak |
4 | RED | tak | tak |
5 | MAGENTA | tak | tak |
6 | BROWN | tak | tak |
7 | LIGHTGRAY | tak | tak |
8 | DARKGRAY | tak | nie |
9 | LIGHTBLUE | tak | nie |
10 | LIGHTGREEN | tak | nie |
11 | LIGHTCYAN | tak | nie |
12 | LIGHTRED | tak | nie |
13 | LIGHTMAGENTA | tak | nie |
14 | YELLOW | tak | nie |
15 | WHITE | tak | nie |
Funkcje ekranowe:
clreol | czyści bieżącą linię od kursora do końca |
clrscr | czyści okienko tekstowe |
delline | usuwa linię, w której znajduje się kursor, a następne wiersze przesuwa o 1 w górę (ostatni wiersz ekranu jest pusty) |
gettext | kopiuje prostokątny obszar ekranu do bufora |
gettextinfo | zwraca informacje o bieżącym trybie tekstowym, położeniu okna i kursora |
gotoxy | ustawia kursor w wierszu i kolumnie podanych w parametrach (w bieżącym okienku tekstowym) |
highvideo | zwiększa jasność wyświetlanych znaków |
insline | wstawia pusty wiersz w linii kursora, przesuwając położne niżej o 1 wiersz w dół (ginie najniższy wiersz ekranu) |
lowvideo | zmniejsza jasność wyświetlanych znaków |
movetext | kopiuje fragment ekranu w inne miejsce |
normvideo | przywraca normalną jasność wyświetlanych znaków |
puttext | kopiuje tekst z bufora na ekran |
_setcursortype | definiuje wielkość kursora |
textattr | ustawia kolor znaku i tła wyświetlanego tekstu |
textbackground | ustawia kolor tła dla nowowyświetlonych znaków |
textcolor | ustawia kolor nowowyświetlonych znaków |
wherex | zwraca kolumnę kursora w aktualnym okienku tekstowym |
wherey | zwraca wiersz kursora w aktualnym okienku tekstowym |
window | definiuje prostokątne okienko tekstowe, w którym będą odbywać się kolejne operacje ekranowe |