Jazyk C++ Přednáška č.2 Proudy, manipulátory Práce se soubory 21.4.2017 C++ Přednáška č.2
Manipulátory Bez parametrů (mohou být i jako bity v flags), patří do virtuální třídy ios S parametry (nutný iomanip) 21.4.2017 C++ Přednáška č.2
ios::flags Jsou to bity enum (ios enumerators) které lze kombinovat bitovou operací OR ( | ). Je to členská funkce std Flags parameter musí mít jednu z následujících hodnot: 21.4.2017 C++ Přednáška č.2
ios::flags (pokrač.) ios::skipws Přeskočit mezeru ve vstupním proudu ios::left Zarovnat vlevo s použitím výplňových znaků ios::right Zarovnat vpravo s použitím výplňových znaků ios::internal Add fill characters after any leading sign or base indication, but before the value. ios::dec Číselný základ bude 10 (implicitní) ios::oct Číselný základ bude 8 (octal). ios::hex Číselný základ bude 16 (hexadecimal). ios::showbase Použít předponu 0 nebo 0x u oct/hex čísel ios::showpoint Použít desetinný zápis ios::uppercase V číslech používat velká písmena (u oct, hex, exponenty) ios::showpos použít znak + u kladných čísel. ios::scientific Čísla v plovoucí řádové čárce zobrazit ve vědeckém zápisu. ios::fixed Použít pevný formát u čísel v plovoucí řádové čárce. ios::unitbuf Cause ostream::osfx to flush the stream after each insertion. By default, cerr is unit buffered. ios::stdio Cause ostream::osfx to flush stdout and stderr after each insertion. 21.4.2017 C++ Přednáška č.2
#include <iostream> #include <iomanip> #include <conio.h> #pragma hdrstop using namespace std; //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { int i=234; cout.setf(ios::showbase); // zaradi ox u hex a 0 u oct cout << hex << i << " = " << 123 << oct << 80 << endl; cout.setf(ios::left | ios::uppercase); // zarovnani vlevo + velka pismena cout.width(20); // cirka 20 - prvni cislo cout << hex << i << " = " << 123 << " --- " << oct << 80 << "<<" << endl; cout << hex << i << " = " << 123 << " --- " << oct << 80 << "<<" << endl; while(!kbhit()); return 0; } 21.4.2017 C++ Přednáška č.2
Funkce cout Další členské funkce cout.width(25); //šířka datového výstupu cout.put(znak); // výstup jediného znaku cout.write(něco); // jako operátor << cout.fill(znak); // výplňový znak 21.4.2017 C++ Přednáška č.2
Příklad na funkce cout cout << "Zacatek >"; cout.width(25); cout << 123 << "< Konec\n"; cout.fill('*'); // platí pro 1 následující údaj Vytiskne: Zacatek > 123< Konec Zacatek >**************123< Konec 21.4.2017 C++ Přednáška č.2
Seznam manipulátorů flush – vyprázdní výst. buffer endl – konec řádku a vyprázdní buffer oct – výstup bude osmičkový dec – výstup bude dekadický hex – výstup bude hexa 21.4.2017 C++ Přednáška č.2
manipulátory, které vyžadují iomanip setbase(základ) – nastavuje soustavu výstupu (0,10 – dec; 8- oct; 16 – hex) setw(šířka) – minim. šířka položky setfill(znak) – vyplňovací znak při definované šířce setprecision(přesnost) – přesnost u čísel v pohybl. řádové čárce 21.4.2017 C++ Přednáška č.2
manipulátory, které vyžadují iomanip (pokr.) setiosflags(příznak) – nastavuje jeden nebo více příznaků resetiosflags(příznak) – resetuje jeden nebo více příznaků 21.4.2017 C++ Přednáška č.2
Příznaky ios v manipulátorech setiosflags a re setiosflags ios::left zarovná výstup k zadané šířce doleva ios::right zarovná výstup k zadané šířce doprava ios::interval znaménko je zarovnané doleva, číslo doprava ios::dec desítkový výstup ios::oct osmičkový výstup 21.4.2017 C++ Přednáška č.2
Příznaky ios v manipulátorech setiosflags a resetiosflags (pokr.1) ios::hex hexadecimální výstup ios::showbase přidá 0x k hexa a 0 k osmičkovým výstupům ios::showpoint přidá koncové nuly podle požadované přesnosti ios::uppercase šestnácková čísla a vědecký zápis používají velká písmena 21.4.2017 C++ Přednáška č.2
Příznaky ios v manipulátorech setiosflags a resetiosflags (pokr.2) ios::showpos u kladnýchčísel bude + ios::scientific hodnota s pohyblivou des. čárkou se zobrazuje ve vědeckém zápisu (pouze exponent, nemusí být dělit.3) ios::fixed hodnota s pohyblivou des. čárkou se zobrazuje v desetinném zápisu Existují další, popis hledat s couboru ios a v dokumentaci překladače. 21.4.2017 C++ Přednáška č.2
Funkce pro cin cin.get() – nemá parametr, nelze spojovat cin.get(znak) – lze spojovat 21.4.2017 C++ Přednáška č.2
Příklad int main() { char znak; while ( (znak = std::cin.get()) != EOF) { std::cout << "znak: " << znak << std::endl; } std::cout << "\nHotovo!\n"; return 0; 21.4.2017 C++ Přednáška č.2
Výsledek příkladu: Ahoj - to jsme napsali na klávesnici znak: A znak: h znak: o znak: j ^Z - tím musíme ukončit 21.4.2017 C++ Přednáška č.2
Další fukce cin cin.get(buff, délka) – ukonč. znak zůstává v zásobníku cin.getline(buff,délka) – ukonč. znak se zahazuje; načte celý řádek včetně mezer 21.4.2017 C++ Přednáška č.2
Příklad cin.get(), cin.getline() #include <iostream> using namespace std; int main() { char retezecJedna[256]; char retezecDva[256]; char retezecTri[256]; 21.4.2017 C++ Přednáška č.2
pokr. cout << "Zadejte prvni retezec: "; cin.getline(retezecJedna,256); cout << "retezecJedna: " << retezecJedna << endl; cout << "Zadejte druhy retezec: "; cin >> retezecDva; cout << "retezecDva: " << retezecDva << endl; cout << "Zadejte treti retezec: "; cin.getline(retezecTri,256); cout << "retezecTri: " << retezecTri << endl; return 0; } 21.4.2017 C++ Přednáška č.2
Výsledek: Zadejte první retezec: jedna dva tri retezecJedna: jedna dva tri Zadejte druhy retezec: ctyry pet šest retezecDva: ctyry Zadejte treti retezec: retezecTri: pet sest 21.4.2017 C++ Přednáška č.2
Funkce cin.ignore() cin.ignore(maxpočet,’\n’) – zahodí maximálně určený počet znaků až do konce řádku 21.4.2017 C++ Přednáška č.2
funkce peek() a putback() cin.peek() – načte znak, ale ponechá jej ve vstupním proudu (můžeme jej načíst znovu) cin.putback() – vloží znak do vstupního proudu 21.4.2017 C++ Přednáška č.2
Příklad int main() { char znak; cout << "Zadejte vetu: "; while ( cin.get(znak) ) { if (znak == '!') // vymění znak ! za $ cin.putback('$'); else cout << znak; while (cin.peek() == '#') // na4te znak, ale ponechá jej v proudu cin.ignore(1,'#'); } return 0; 21.4.2017 C++ Přednáška č.2
Výsledek: Zadejte vetu: Prave!ted#je!cas#pobavit!se# (Vymění vykřičníky za dolar a vyhodí #) 21.4.2017 C++ Přednáška č.2
Práce se soubory knihovna <fstream> ofstream fout(nazevSouboru);//otevřít pro zápis ifstream fin(nazevSouboru); //otevření pro čtení zavírání: fout.close(); fin.close(); 21.4.2017 C++ Přednáška č.2
Funkce pro práci se soubory fout() - jako cout, ale do souboru fin.get(znak) fin.ignore(1,'\n'); fin.getline(buffer,255); 21.4.2017 C++ Přednáška č.2
Příklad práce se soubory #include <fstream> #include <iostream> using namespace std; int main() { char nazevSouboru[80]; char buffer[255]; // pro zadání uživatele cout << "Nazev souboru: "; cin >> nazevSouboru; ofstream fout(nazevSouboru); // otevřít pro zápis fout << "Tento radek se primo zapise do souboru...\n"; cout << "Zadejte text souboru: "; 21.4.2017 C++ Přednáška č.2
cin.ignore(1,'\n'); // přeskočení znaku nového řádku za názvem souboru cin.getline(buffer,255); // převzetí zadání uživatele fout << buffer << "\n"; // a jeho zápis do souboru fout.close(); // zavření souboru a příprava pro otevření ifstream fin(nazevSouboru); // otevření souboru pro čtení cout << "Zde mame obsah souboru:\n"; char znak; while (fin.get(znak)) cout << znak; cout << "\n***Konec obsahu souboru.***\n"; fin.close(); // pozornost se vždy vyplatí return 0; } 21.4.2017 C++ Přednáška č.2
Funkce pro práci se soubory fout() - jako cout, ale do souboru fin.get(znak) fin.ignore(1,'\n'); fin.getline(buffer,255); 21.4.2017 C++ Přednáška č.2