// Damian Turczyński I5-ISI
// ZPR praca domowa MANIPULATORY strumieni

#include <ios>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <math.h>

/*	Ogólne informacje:

	Flagi strumieni:
      ios::skipws     = 0x0001,     // ignoruj białe znaki [P3] < tak będę oznaczał, w którym przykładzie można znaleźć zastosowanie
      ios::left       = 0x0002,     // justuj do lewej [P5]
      ios::right      = 0x0004,     // justuj do prawej [P5]
      ios::internal   = 0x0008,     // justuj do środka [P5]
      ios::dec        = 0x0010,     // wypisuj dziesiętnie [P1]
      ios::oct        = 0x0020,     // wypisuj ósemkowo [P1]
      ios::hex        = 0x0040,     // wypisuj szesnastkowo [P1]
      ios::showbase   = 0x0080,     // pokazuj podstawę [P1]
      ios::showpoint  = 0x0100,     // pokazuj kropkę dziesiętną [P2]
      ios::uppercase  = 0x0200,     // wypisuj duże litery w napisach [P1, P7]
      ios::showpos    = 0x0400,     // wypisuj znak + w liczbach dodatnich [P2]
      ios::scientific = 0x0800,     // notacja naukowa (wykładnicza)[P7]
      ios::fixed      = 0x1000,     // notacja zwykła [P7]
      ios::unitbuf    = 0x2000,     // nie buforuj strumienia (flush po każdym wpisywaniu)
	  ios::stdio      = 0x4000      // ustaw tryb kompatybilności z stdio

	Manipulatory bezparametrowe(std):
		hex, dec, oct - podstawa systemu pozycyjnego wyświetlania liczb odpowiednio szesnastkowy, dziesietny, oktarny [P1]
		fixed, scientific - system odpowiednio zwykły, naukowy [P7]
		internal, left, right - wyrównywanie	[P5]
		
		boolalpha, noboolalpha - wartosci typu bool sa wstawiane jako ich nazwy (włącz/wyłącz) [P6]
		showbase, noshowbase - pokaż, nie pokazuj bazę [P1]
		uppercase, nouppercase - pokaż duże, małe litery (np. w systemie szesnastkowym lub notacja naukowa e) [P1, P7]
		showpoint, noshowpoint - pokaż, nie pokazuj kropkę dziesiętną [P2]
		showpos, noshowpos - pokaż, nie pokazuj + przed liczbą dodatnią [P2,P5]
		skipws, noskipws - pomijaj nie pomijaj białe znaki (tab, enter, spacja) [P3]
		unitbuf, nounitbuf - czyść, nie czyść buforu po wpisywaniu
		
	Manipulatory wyjściowe
		flush - opróżnij bufor strumienia 
		endl - kończy linię i przechodzi do następnej [P1-P7]
		ends - kończy napis (string) (wstawia '\0') przydatne przy zapisywaniu do pliku napisów etc.

	Manipulatory wejściowe
		ws - pomiń białe znaki czekające w buforze [P3]

	Manipulatory parametrowe
		setw(int) - szerokość wypisywanego tekstu  [P5]
		setprecision(int) - ilość miejsc rozwinięcia dziesiętnego  [P4]
		setfill(char) - znak wypełniający puste miejsce [P5]
		setiosflags(ios_base::fmtflags), resetiosflags(ios_base::fmtflags ) - ustwienie/zerowanie flagi 
		setbase(int) - ustawienie podstawy systemu pozycyjnego [P1]
		
	Inne funkcje na strumieniach:
		int width(int) - szerokość wypisywanego tekstu [P5]
		int precision(int) - ilość miejsc rozwinięcia dziesiętnego [P4]
		int fill(int) - znak wypełniający puste miejsce [P5]

*/

using namespace std;
int main(){
	// 	Funckja 
	// 		fmtflags setf ( fmtflags fmtfl );
	// 		fmtflags setf ( fmtflags fmtfl, fmtflags mask );
  
	//	Pierwsza składnia ustawia flagi formatu strumienie włączając flagę fmtfl nie zmieniając reszty.
	//  Druga skłądnia ustawia flagi formatu strumienia które są wspólne dla fmtfl i maski i wyłącza 
	//	te których bity są w masce ale nie w fmtfl.
	//  Obie zwracają wcześniej ustawione flagi.


	cout << "  *** Przyklad 1: ***" << endl;
//	Przykład 1: (setf, unsetf, hex, basefield, uppercase, dec)
	const int x = 253;

	cout.setf(ios::hex, ios::basefield);     // ustawienie hexarnego systemu jako podstawa
	cout << x << "=" ;						
	cout.setf(ios::uppercase);				// duże litery zamiast małych (w systemie hex)
	cout << x << "=" ;		
	cout << setiosflags(ios::dec) ;			// ustawienie systemu dziesiętnego 
	cout << x << endl;							// wyświetlenie w dwóch formatach (dec to
	
	//	Funkcja
	//	void unsetf ( fmtflags mask );
	//  Wyłącza flage mask.
	cout.unsetf(ios::uppercase);				// powrót do małych liter
	
	cout << hex << x << "=" << dec << x << endl;									//również systemy można zmieniać przez manipulatory 
	cout << showbase << setbase(16) << x << "=" << setbase (10) << 253 <<endl;	//lub manipulatorem parametryzowanym (i pokazanie bazy)

	
	cout << "  *** Przyklad 2: ***" << endl;
//	Przykład2: (showpoint, showpos)
	float one = 1.0;
	
	cout.setf(ios::showpoint | ios::showpos);			//włączenie pokazywania kropki dziesiętnej oraz znaku przed liczbą
	cout << "Z kropka i znakiem: "<< one << endl;
	
	cout.unsetf(ios::showpoint | ios::showpos);		//funkcja wyłączająca daną flagę to usetf :
	cout << "Bez kropki i znaku: " << one <<endl;
	
	cout << "  *** Przyklad 3: ***" << endl;
//	Przykład 3:	(skipws)
	char a, b;

	istringstream iss (" \n\t 12"); 
	iss >> skipws >> a >> b ;	//najpierw pominie biale znaki potem pobierze to co zostanie (biale znaki to tab, spacja i enter)
	//j.w. inny zapis iss >> ws >> a >> b ;
	cout << a << b << endl;		//to samo można uzyskać ustawiając flagę ios::skipws
	
	cout << "  *** Przyklad 4: ***" << endl;
// Przykład 4: (manipulatory z parametrami)
	const double number = 3.14159265;
	int pom = cout.precision(2); //funkcja zwraca wcześniej zadaną prezycję i ustawia precyzję podaną w nawiasie
	cout << number << endl;
	cout << setprecision(pom) << number << endl;	// ustawia spowrotem na to co było przed zmianą

	cout << "  *** Przyklad 5: ***" << endl;
// Przykład 5: (Ogólna tabelka, fill, width, showpos)

	for(int i = 0 ; i < 7; ++i){				
																//ustawia pełne wyrównanie do prawej
		cout << right << setw(5) << setfill('_') <<i*i*10<<'\t';	//ustawia wypełnienie miejsc które są puste znakiem _
														//szerokość zarezerwowana na następny wypis
		cout.fill(' ');									//wypełnianie spacjami
		cout.width(10);									//szerokość ustawiona na 10 (gdy np liczba dłuższa - obcinanie)
		cout.setf(ios::left | ios::showpos);			//wyrówynywanie do lewej i pokazywanie znaków
		cout << (i%2?(-1):(1))*((12+i*i/6))*i*i*9%3000;	//jakaś liczba (nie ma to znaczenia)
		cout.unsetf(ios::left | ios::showpos);			//wyłączenie wyrównania do lewej i pokazywanie znaków
		cout.unsetf(ios::left);							//wyłączenie wyrównania do lewej
 		cout <<" |  ";
 		cout.width(10);
 		cout.setf(ios::internal);						//znak do lewej liczba do prawej. To samo co cout<< internal;
 		cout << (i%2?(-1):(1))*((13+i*i/3))*i*i*12%3000;
		
		cout << endl;
	}
	cout.unsetf(ios::showpos | ios::showpoint);							//wyłączenie pokazywania znaku

	cout << "  *** Przyklad 6: ***" << endl;
//Przykład 6: (boolalpha, noboolalpha)


	bool bul = true;
	cout << boolalpha << bul << " lub ";		//wyświetlanie nazwy bool zamiast liczby
	cout << noboolalpha << bul << endl;			//zamiast napisu liczba (true - 1, false - 0)
	
	cout << "  *** Przyklad 7: ***" << endl;
//Przykład 7: (fixed, scientific, uppercase)
	const double num= 53400;
	cout << fixed << num << endl;					//wyświetlanie normalnym trybem
	cout << uppercase << scientific << num << endl;	//i naukowym z dużym E
	

	system("PAUSE");
}

