Im program dłuższy tym mniej sprawny.
C++: Funkcje bibliotek standardowych

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:
clearerrzeruje wskaźnik błędu strumienia
fclosezamyka strumień
feofsprawdza, czy osiągnięto koniec strumienia (ang. End Of File)
ferrorsprawdza, czy wystąpił błąd w ostatniej operacji strumieniowej
fflushopróżnia bufor strumienia
fgetcwczytuje następnego znak ze strumienia
fgetposodczytuje aktualną pozycję wskaźnika w strumieniu
fgetswczytuje łańcuch znaków ze strumienia
fopenotwiera strumień
fprintfformatowany zapis do strumienia
fputczapisuje 1 znak do strumienia
fputcharzapisuje 1 znak do strumienia
fputszapisuje łańcuch znaków do strumienia
freadodczytuje blok danych ze strumienia
freopenponownie otwiera strumień z przekierowaniem na inny strumień
fscanfformatowany odczyt ze strumienia
fseekustawienie wskaźnika strumienia w nowym położeniu
fsetposustawienie wskaźnika strumienia w zapamiętanym położeniu
ftellodczytanie aktualnej pozycji wskaźnika w strumieniu
fwritezapis bloku danych do strumienia
getcodczytanie następnego znaku ze strumienia
getcharodczytanie znaku ze strumienia
getsodczytanie łańcucha znaków ze strumienia
getwodczyt następnej liczby typu int ze strumienia
perrorwyświetlenie komunikatu błędu
printfformatowany zapis do strumienia
putczapis znaku do strumienia
putcharzapis znaku do strumienia
putszapis łańcucha znaków do strumienia
putwzapis liczby typu int do strumienia
removeusunięcie pliku z dysku
renamezmiana nazwy pliku lub katalogu
rewindustawienie wskaźnika na początku strumienia
scanfformatowany odczyt danych ze strumienia
setbufprzydziela bufor dla strumienia
setvbufprzydziela bufor dla strumienia
tmpfiletworzy i otwiera plik tymczasowy
tmpnamgeneruje 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:

atofkonwersja zmiennej typu string na typ double
atoikonwersja zmiennej typu string na typ integer
atolkonwersja zmiennej typu string na typ long
ecvtkonwersja zmiennej typu double na typ string bez kropki dziesiętnej
fcvtkonwersja zmiennej typu double na typ string z zaokrągleniem do określonej ilości cyfr
gcvtkonwersja zmiennej typu double na typ string
itoakonwersja zmiennej typu integer na typ string
ltoakonwersja zmiennej typu long na typ string
strtodkonwersja zmiennej typu string na typ double
strtolkonwersja zmiennej typu string na typ long
strtoulkonwersja zmiennej typu string na typ unsigned long
ultoakonwersja 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:
Rozkład zmiennych w pamięci
Funkcje operujące na łańcuchach znaków:
memchrwyszukuje znaku w buforze pamięci
memcmpporównuje zawartość buforów pamięci
memcpykopiuje znaki miedzy buforami pamięci
memmovekopiuje znaki miedzy buforami pamięci
memsetzapełnia bufor pamięci podanym znakiem
strcatłączy dwa łańcuchy znaków
strchrwyszukuje pierwszego wystąpienia znaku w łańcuchu znakowym
strcmpporównuje dwa łańcuchy znakowe
strcmpiporównuje dwa łańcuchy znakowe bez rozróżniania wielkości liter
strcpykopiuje jeden łańcuch znakowy do drugiego
strcspnwyszukuje w łancuchu pierwszego znaku należącego do podanego podzbioru
strerrorpobiera komunikat o błędzie
strlenzwraca długość łańcucha znakowego
strncatdołącza określoną ilość znaków z jednego łańcucha do drugiego
strncmpporównuje część znaków w 2 łańcuchach
strncpykopiuje określoną ilość znaków z jednego łańcuchaq do drugiego
strpbrkwyczukuje w łańcuchu jakiegokolwiek znaku z innego łańcucha
strrchrwyszukuje ostatniego wystąpienia znaku w łańcuchu znakowym
strspnwyczukuje w łańcuchu pierwszego znaku nie należącego do innego łańcucha
strstrwyszukuje ciągu znaków w łańcuchu znakowym
strtokwyodrę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łanieTyp zmiennej i wynikuFunkcja
moduł liczbyint
long
double
long double
abs
labs
fabs
fabsl
najmniejsza liczba całkowita >= od podanejdouble
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 podanejdouble
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ówmatherr
zwraca większą z 2 wartościwszystkiemax
zwraca mniejszą z 2 wartościwszystkiemin
wyznaczenie wartości wielomianudouble
long double
poly
poly
obliczenie dowolnej potęgidouble
long double
pow
pow
obliczenie potęgi o podstawie 10double
long double
pow10
pow10
generator losowych liczb całkowitychrand
generator losowych liczb całkowitychrandom
inicjuje generator liczb losowychrandomize
inicjuje generator liczb losowychsrand
pierwiastek kwadratowy liczbydouble
long double
sqrt
sqrtl
Funkcje trygonometryczne:
DziałanieTyp zmiennej i wynikuFunkcja
cosinusdouble
long double
cos
cosl
sinusdouble
long double
sin
sinl
tangensdouble
long double
tan
tanl
arcus cosinusdouble
long double
acos
acosl
arcus sinusdouble
long double
asin
asinl
arcus tangensdouble
long double
atan
atanl
cosinus hiperbolicznydouble
long double
cosh
coshl
sinus hiperbolicznydouble
long double
sinh
sinhl
tangens hiperbolicznydouble
long double
tanh
tanhl

 
Zarządzanie pamięcią
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ą:

mallocdynamiczne przydzielenie bloku pamięci
callocalokacja pamieci dla tablicy
reallocponowne przydzielenia pamięci
freezwolnienie dynamicznie przydzielonej pamieci

 
Kontrola procesów

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:

abortawaryjne zakończenie programu
atexitrejestracja funkcji wykonywanej przy wyjściu z programu
exitzakończenie programu
getenvpobranie zmiennej środowiskowej systemu operacyjnego
putenvtworzy lub modyfikuje zmienną środowiskową systemu operacyjnego
systemwykonuje polecenie systemowe, uruchamia inny program
Procedury ekranowe

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ść numerycznaWartość symbolicznaKolor tekstuKolor tła
0BLACKtaktak
1BLUEtaktak
2GREENtaktak
3CYANtaktak
4REDtaktak
5MAGENTAtaktak
6BROWNtaktak
7LIGHTGRAYtaktak
8DARKGRAYtaknie
9LIGHTBLUEtaknie
10LIGHTGREENtaknie
11LIGHTCYANtaknie
12LIGHTREDtaknie
13LIGHTMAGENTAtaknie
14YELLOWtaknie
15WHITEtaknie

Funkcje ekranowe:

clreolczyści bieżącą linię od kursora do końca
clrscrczyści okienko tekstowe
dellineusuwa linię, w której znajduje się kursor, a następne wiersze przesuwa o 1 w górę (ostatni wiersz ekranu jest pusty)
gettextkopiuje prostokątny obszar ekranu do bufora
gettextinfozwraca informacje o bieżącym trybie tekstowym, położeniu okna i kursora
gotoxyustawia kursor w wierszu i kolumnie podanych w parametrach (w bieżącym okienku tekstowym)
highvideozwiększa jasność wyświetlanych znaków
inslinewstawia pusty wiersz w linii kursora, przesuwając położne niżej o 1 wiersz w dół (ginie najniższy wiersz ekranu)
lowvideozmniejsza jasność wyświetlanych znaków
movetextkopiuje fragment ekranu w inne miejsce
normvideoprzywraca normalną jasność wyświetlanych znaków
puttextkopiuje tekst z bufora na ekran
_setcursortypedefiniuje wielkość kursora
textattrustawia kolor znaku i tła wyświetlanego tekstu
textbackgroundustawia kolor tła dla nowowyświetlonych znaków
textcolorustawia kolor nowowyświetlonych znaków
wherexzwraca kolumnę kursora w aktualnym okienku tekstowym
whereyzwraca wiersz kursora w aktualnym okienku tekstowym
windowdefiniuje prostokątne okienko tekstowe, w którym będą odbywać się kolejne operacje ekranowe
« wstecz   dalej »