Program, aby mógł być użyteczny musi sygnalizować swoje działanie na ekranie konsoli. Służy do tego np. komenda printf(), poznana już uprzednio. Jest to komenda należąca do standardowej biblioteki stdio.h (cstdio) języka C. Jednakże w C++ wprowadzono zagadnienie strumieni i zdefiniowano narzędzia pracujące z nimi. Są to np. cout – do wyprowadzania danych na konsolę (np. monitor) oraz cin do pobierania danych z konsoli (np. klawiatura). Dodatkowym strumieniem jest dedykowany wyprowadzaniu komunikatów o błędach strumień cerr. Wszystkie te strumienie należą do przestrzeni nazw std.

Przestrzenie nazw są abstrakcyjnym zbiorami struktur będących powiązanymi ze sobą zespołami procedur, wartości itp. zamkniętych w celu ograniczenia możliwości konfliktu w unikalnym nazewnictwie danych/metod, a jednocześnie w celu umożliwienia korzystania z nich w sposób intuicyjny.

#include<iostream>   // std::cout, std::endl

int main() {
	std::cout << "Ala ma kota" << std::endl;
	return 0;
}

Jak widać na powyższym przykładzie użyliśmy strumienia cout będącego elementem przestrzeni nazw std za pomocą klasyfikatora dostępu ::, czyli użyliśmy std::cout (a także std::endl, gdzie endl jest również elementem danej przestrzeni nazw, a służy do zakończenia wiersza i przejścia do nowej linii – jest to prawie dokładny odpowiednik znaku sterującego “\n” (dla Windows powinno to być “\r\n” z uwagi na to, że znak końca wiersza dla Windows jest złożeniem komendy “\r” powrotu karetki (kursora) oraz “\n” przejścia do nowej linii), różnicą jest to, że stosowanie endl powoduje także całkowite opróżnienie strumienia, co wymaga więcej czasu i ma większą złożoność programową).

Możemy także zdefiniować własną przestrzeń nazw, grupując w ten sposób w jednym bloku zmienne czy metody używane do ich manipulacji.

#include <iostream>

namespace Matematyka
{
   int dodaj(int a, int b)
   { return a+b;   }

   int odejmij(int a, int b)
   { return a-b;   }
}
// nie musimy definiować od razu całej przestrzeni nazw.
namespace Matematyka
{ 
   int pomnoz(int a, int b)
   { return a*b;    }

   int podziel(int a, int b)
   { return a/b;    }
}

int main()
{ 
   std::cout << Matematyka::dodaj(10, 20) << std::endl;
   return 0;
}

Użytkowanie wskazanej przestrzeni nazw z ustawicznym podawaniem jej desygnatora std może być niewygodne, szczególnie w momencie, gdy nie zachodzi niebezpieczeństwo mieszania zakresów różnych przestrzeni nazw. W takim przypadku wygodnym jest poinformować kompilator, że użytkujemy obiekty będące elementami wskazanej przestrzeni nazw, dzięki czemu nie musimy już więcej podawać ich desygnatorów zasięgu tak jak w poniższym przykładzie:

#include<iostream> 

using namespace std;
int main() {
	cout << "Ala ma kota" << endl;
	return 0;
}

Zadanie do samodzielnego wykonania:
Należy zapoznać się z zagadnieniem przestrzeni nazw oraz elementów wchodzących w skład std. Przećwiczyć stosowanie wyjścia konsolowego z użyciem strumienia cout.

Za pomocą komendy printf() można prócz wyświetlania samych treści dokonać jeszcze ich formatowania, aby uzyskać porządnie sformatowany, czytelny i “miły dla oka” wynik działania programu i tak dla poniższego przykładu programu wyświetlającego kilka wartości:

#include <cstdio>

int main() {
	int a=10, b=12, c=34, d=0, e=-17, f=33;
	float g=6.3f;
	printf("%5d%5d%5d%5d%5d%5d%5.5f \n",a,b,c,d,e,f,g);
	return 0;
}

Jako pierwszy parametr komendy printf() jest użyty preformatowany string zawierający specjalne znaki formatujące postać wynikową, następnymi parametrami są wartości użyte w ramach stringu preformatowanego.

Taki sam program możemy zapisać w stylu strumieniowym używając manipulacji strumienia dzięki czemu sformatujemy dane w podobny sposób:

#include<iostream>   // std::cout, std::endl, std::fixed
#include<iomanip>    // std:setw(), std::setprecision() itp.

using namespace std;
int main() {
	
	int a=10, b=12, c=34, d=0, e=-17, f=33;
	float g=6.3f;
	cout <<setw(5)<<a<<setw(5)<<b<<setw(5)<<c<<setw(5)<<d<<setw(5)<<e<<setw(5)<<f<<setw(5)<<fixed<<setprecision(5)<<g<<endl;
	return 0;
}

Wymagana jest do tego dodatkowa biblioteka iomanip. Używanie manipulatorów formatowania w przypadku strumienia wymaga każdorazowego wysłania ich przed wyświetleniem oczekiwanego formatu i treści. W zasadzie jest to to samo co w przypadku printf(), gdzie każdą zmienną wpierw musimy umieścić w łańcuchu tekstowym wraz z deklaracją oczekiwanego sposoby jej sformatowanego wyświetlania.

Jak widać efekt jest w zasadzie identyczny, a realizacja dokonana raz za pomocą struktur językowych należących do standardu C, a w drugim przypadku do standardu C++, co wskazuje na inną filozofię programowania. Najważniejszą kwestią jest w tym przypadku wybranie właściwej dla siebie kodyfikacji formatu i nie mieszanie ze sobą w jednym programie różnych jej metod – nie wpływa to negatywnie na działanie programu, ale stanowi wizytówkę programisty – czysty i przejrzysty kod bez niechlujstwa braku własnej konsekwencji notacji programu.

Drugą różnicą jest szybkość działania komend – komendy cout i pokrewne działają nieco wolniej – wynika to z filozofii opakowania tych operacji w kod zabezpieczający przed błędami i konfliktami oraz faktem, że są buforowane wyniki przed ich uwidocznieniem. Komenda printf() wysyłając dane do stdout robi to “natychmiastowo”.
Jednym ze sposobów “przyśpieszenia” operacji cout jest synchronizacja strumieni komendą ios_base::sync_with_stdio(0); Niemniej jednak właściwą filozofią programowania winno być używanie konstrukcji ze specyfikacji C++ czyli cout i pokrewnych. Zwiększa to wspomnianą niezawodność kodu, jego elastyczność, wpływa na dziedziczenie i zmniejsza skłonność do występowania błędów.

Zadania do samodzielnego wykonania:
Należy zadeklarować i zainicjalizować kilka zmiennych różnych typów wybranymi wartościami i spróbować wyświetlić je w sposób sformatowany za pomocą obu poznanych metod (printf()cout). Zapoznać się z dostępnymi manipulatorami strumienia dla zastosowań z cout.