Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Kurs C++

Obsługa strumienia wyjściowego

[lekcja] Rozdział 6. Zapoznanie się z obsługą standardowego wyjścia za pomocą funkcji printf oraz strumienia std::cout.
W niniejszym rozdziale będziemy zajmować się wyświetlaniem danych. Co prawda była już na ten temat krótka wzmianka i temat być może wydaje się dla Ciebie wyczerpany, jednak niestety jest tu sporo do powiedzenia. Jak już zapewne wiesz język C++ jest potomkiem języka C. W związku z tym do istniejących komponentów C zostały dodane ich odpowiedniki w stylu C++. W celu zachowania wstecznej zgodności, tj. z językiem C - stare komponenty zostały zachowane i również można z nich korzystać w C++. W konsekwencji mamy do dyspozycji dwa mechanizmy do wypisywania danych na standardowe wyjście, które w naszym wypadku jest konsolą. W niniejszym rozdziale wymienimy te dwie stosowane techniki, jednak szerzej zostanie omówiona metoda prostsza w użyciu, należąca do języka C++.

Funkcja printf

Funkcję » standard Cprintf mieliśmy okazję zobaczyć w działaniu już kilkukrotnie. W tym rozdziale poznamy ją trochę lepiej, jednak to będzie ostatni rozdział poświęcony tej funkcji w podstawowej części kursu. Funkcja ta wywodzi się bowiem z języka C i nie jest zbyt przyjemna w użyciu dla początkującego programisty. Przejdźmy teraz do wcześniej omawianego przykładu:
C/C++
#include <cstdio>
int main()
{
    printf( "Test dzialania Code::Blocks" );
    return 0;
}
Powyższy wiersz jakby się mogło wydawać na pierwszy rzut oka jest oczywisty i efekt działania powyższego programu jest łatwo przewidywalny. Jak już pisałem w jednym ze wcześniejszych rozdziałów powyższy wiersz wyświetli komunikat:
Test dzialania Code::Blocks

Funkcja » standard Cprintf może przyjmować jednak więcej niż jeden argument, co przedstawiam w poniższym przykładzie:
C/C++
#include <cstdio>
int main()
{
    printf( "Czy %d jest wieksze od %s?", 3 + 4, "siedem" );
    return 0;
}
O ile pierwszy wariant wywołania był oczywisty tak tutaj już tak nie jest. Pojawiają się bowiem tajemnicze argumenty, które nie wiadomo jak zadziałają w programie. Warto jednak najpierw wtrącić słowo co to jest argument. Argumentem nazywamy wartość przekazywaną do funkcji. Kolejne argumenty są rozdzielone przecinkami. Innymi słowy funkcja » standard Cprintf przyjęła trzy argumenty. Pierwszym z nich jest tekst "Czy %d jest wieksze od %s?", drugim działanie arytmetyczne 3+4 i trzecim znowu tekst o treści "siedem".

Pytanie jakie tu należy zasadniczo zadać to co wyświetli wyżej wspomniane wywołanie funkcji i dlaczego. Po uruchomieniu tego programu ujrzymy następującą treść:
Czy 7 jest wieksze od siedem?

Porównując wywołanie funkcji z treścią którą otrzymaliśmy można łatwo zauważyć, że zamiast zapisu %d pokazała się nam liczba 7, natomiast w miejscu %s ukazał się napis siedem. Pierwszy argument funkcji » standard Cprintf w rzeczywistości służy do formatowania wyjścia, tj. sposobu prezentacji danych. Znak % jest znakiem specjalnym, po którym następuje określenie sposobu prezentacji kolejnych argumentów funkcji » standard Cprintf. Zapis %d informuje, że argumentem będzie liczba całkowita, natomiast %s mówi funkcji, że będzie to łańcuch znaków. Funkcja » standard Cprintf jest znacznie bardziej rozbudowana niż te dwa podstawowe typy. Nie będziemy się jednak w nią zagłębiać ze względu na to, iż będziemy wykorzystywali inne i znacznie prostsze narzędzie do wypisywania danych.

Więcej informacji o tej funkcji możesz znaleźć w dokumentacji znajdującej się na łamach niniejszego serwisu pod hasłem » standard Cprintf.

Strumień wyjścia std::cout

Pomimo, iż znamy już powierzchownie jedną technikę wypisywania różnych danych na ekranie - pora poznać inną, którą znacznie bardziej docenisz w toku nauki programowania. Jest nią użycie strumienia std::cout. Na początek przytoczę program, który już widzieliśmy wcześniej z tą różnicą, że będzie on napisany w C++. Oto on:
C/C++
#include <iostream>
int main()
{
    std::cout << "Test dzialania Code::Blocks";
    return 0;
}
Powyższy program wypisze dokładnie to, co jest zawarte w podwójnych apostrofach. Zapis std::cout powoduje skierowanie danych na standardowy strumień wyjściowy tak samo jak to robiła funkcja » standard Cprintf. W programie tym występują również znaki <<, które nazywamy operatorem. Za pomocą operatora << 'wskazujemy' dane, które mają zostać przekazane do strumienia.

Pierwszy przykład jest na tyle oczywisty, że nie wymaga on dalszych wywodów, tak więc przejdźmy do kolejnego programu.
C/C++
#include <iostream>
int main()
{
    std::cout << "Czy ";
    std::cout << 3 + 4; //drugi argument w printf
    std::cout << " jest wieksze od ";
    std::cout << "siedem"; //trzeci argument w printf
    return 0;
}
Powyższy kod realizuje dokładnie to samo, co wcześniej przedstawiony program, używający » standard Cprintf (nie trzeba chyba wskazywać o który kod konkretnie chodzi). Jak widać wiersze w których występują komentarze zawierają te same dane, które były przekazane za pomocą drugiego i trzeciego argumentu funkcji » standard Cprintf. Istotną różnicą jest jednak brak %d oraz brak %s. Fakt ten powinien mieć dla Ciebie istotne znaczenie - mniej musisz pamiętać by otrzymać ten sam efekt. Powyższy fakt jest głównym powodem dlaczego będziemy korzystali ze strumienia wyjściowego std::cout. Zanim zaczniesz narzekać na to, że zapis jest dużo dłuższy - miej świadomość tego, że język C++ oferuje kilkanaście typów podstawowych, np. liczba całkowita krótka 16-bitowa, zwykła 32-bitowa i długa 64-bitowa. Każda z wcześniej wymienionych liczb może być ze znakiem lub bez. Do tego dochodzą znaki, liczby zmiennoprzecinkowe, wartości logiczne, wskaźniki i być może jeszcze inne podstawowe typy, które w chwili obecnej pominąłem. Dla każdego wyżej wymienionego typu zapis w funkcji » standard Cprintf występujący po % będzie wyglądał inaczej, natomiast w przypadku użycia mechanizmu C++ kompilator 'wie' co z danym typem zrobić. Na deser warto jeszcze przedstawić jak można zapisać ten sam kod krócej.
C/C++
#include <iostream>
int main()
{
    std::cout << "Czy " << 3 + 4 << " jest wieksze od " << "siedem";
    return 0;
}
Jak widać strumień std::cout jest znacznie wygodniejszym narzędziem w rękach początkowego programisty.

Znaki specjalne

Zanim przejdziemy do następnego rozdziału dobrze będzie zapoznać się jeszcze ze znakami specjalnymi, jakie można wstawić we wypisywanym tekście. Do najczęściej używanych znaków należą: tabulacja, przejście do nowego wiersza, backslash i podwójny apostrof. Aby wyświetlić znaki specjalne w treści należy je poprzedzić backslashem (\ ). Poniższa tabelka przedstawia tylko te najczęściej używane:
OpisJęzyk CJęzyk C++
przejście do nowego wiersza\nstd::endl
tabulacja\t(brak - patrz zapis języka C)
backslash\\(brak - patrz zapis języka C)
Na koniec krótki przykład wykorzystujący powyższe znaki specjalne:
C/C++
#include <iostream>
#include <cstdio>
int main()
{
    std::cout << "\t tekst \"C:\\Hej\\ho.txt.\"" << std::endl;
    printf( "Uczymy sie \" pisac \t tekst C:\\Hej\\ho.txt. w stylu C\n" );
    printf( "\n\na tu konczymy zabawe" );
    std::cout << std::endl << std::endl << "zrob sobie przerwe :)" << std::endl;
   
    return 0;
}
Po uruchomieniu zobaczymy na ekranie następującą treść:
         tekst "C:\Hej\ho.txt."
Uczymy sie " pisac       tekst C:\Hej\ho.txt. w stylu C


a tu konczymy zabawe

zrob sobie przerwe :)

Process returned 0 (0x0)   execution time : 0.015 s
Press any key to continue.

Błędy kompilacji

Jeżeli zapomnisz dołączyć pliku nagłówkowego iostream, to prawdopodobnie próba skompilowania zakończy się niepowodzeniem. W logu kompilacji znajdziesz błąd o następującej treści:
In function 'int main()':
error: 'cout' is not a member of 'std'
Przetłumaczony błąd brzmi następująco:
W funkcji 'int main()':
błąd: 'cout' nie należy do 'std'
Innymi słowy: kompilator poinformował Ciebie, że nie wie co to jest cout. Rozwiązaniem tego problemu jest oczywiście dopisanie linijki, która dołączy bibliotekę iostream w której znajduje się definicja cout. Linijka ta wygląda następująco:
#include <iostream>
.

Zadanie domowe

Napisz program, który wyświetli na ekranie:
==============
= To proste! =
==============
    A jak to zrobic?
Koniec :)
Poprzedni dokument Następny dokument
Komentarze Przestrzeń nazw std