Programovací jazyk C++ MZLU - PEF - Ústav informatiky 11. října 2007
Vstup na terminál a čtení z něj Používá se knihovna iostream. Pro výstup lze použít standardní výstup cout. nebo chybový výstup cerr. Pro načtení vstupního řetězce standardní vstup cin. #include <iostream> int main(void){ int cislo; cout << "Napis cislo" << endl; cin >> cislo; cout << "Napsal jsi: " << cislo << endl; cerr << "Nastala neznama chyba" << endl; return 0; }
Přesměrování proudů na úrovni OS přesměruj výpis příkazu do souboru ls>jmenosouboru.txt přesměruj standardní výstup program 1>jmenoSouboru.txt přesměruj chybový výstup program 2>jmenoSouboru.txt zahod chybový výstup program 2>\dev\null přesměruj chybový výstup na standardní 2>&1
Parametry funkce main Programu je občas potřeba předat parametry (format c:). V C++ musíme deklarovat parametry funkce main následujícím způsobem: int main(int argc, char *argv[]) { cout << "pocet parametru: " << argc << endl; for (int i=0; i<argc; i++) cout << argv[i] << " "; cout << endl;... Promn argc vrací počet pametrů, které byly předány +1. Promn argv je pole řetězeců, kde každá buňka obsahuje parametr. K parametrům přistupujeme klasicky argv[1], argv[2],... Parametry jsou číslovány od jedničky! argv[0] je jméno programu.
Manipulátory nástroje pro práci s proudem Pro manipulátory s parametrem je potřeba použít knihovnu iomanip. endl konec řádku a vyprázdni buffer. flush vyprázdni buffer. dec, hex, oct výpis čísel v destkové, šestnáctkové, osmičkové soustavě. setw(x) počet znaků na které bude zarovnáno. setfill("x") jakým znakem bude vyplňováno. #include <iostream> #include <iomanip> int main(void) { int c = 1000, b = 9; cout<<setw(3)<<"b="<<b<<endl<<"c="<<c<<endl; cout<<setw(3)<<setfill( @ )<<hex<<"c="<<c;...
GetLine načtení celé řádky Čte celé řádky, ne jen do prvního bílého znaku. Má 3 parametry: řetzec, maximální počet znaků a ukončovací znak řádku. Ukončovací znak je implicitně nastaven na \n. #include <iostream> int main(void) { char s[100]; cout << "Napis retzec" << endl; cin.getline(s,99); cout << "Napsal jsi " << s <<endl; return 0; }
Zápis do souboru Pracujeme také s proudy i metody čtení jsou stejné. Musíme načíst knihovni fstream. Výstupní proud pak deklarujeme jako ofstream. #include <iostream> #include <fstream> int main(){ ofstream out; out.open("temp.txt"); } for(int i=1;i<=10;i++) { out << i << endl; }
Kontrola zápisu do souboru Vždy je vhodné kontrolovat, zda se povedlo soubor otevřít (vytvořit). #include <iostream> #include <fstream> int main(){ ofstream out; out.open("pokus.txt"); if (out.is_open()) { out << "radka textu"; out.close(); } else cout << "Soubor se nepodarilo nacist..."; }
Čtení ze souboru Opět musíme načíst knihovni fstream. Vstupní proud pak deklarujeme jako ifstream. #include <iostream> #include <fstream> int main(){ string slovo; ifstream in; in.open("temp.txt"); if (in.is_open()) { while(in >> slovo) cout << slovo << " "; cout << endl; } }
Triviální kopie souboru po znacích int main() { ifstream from("soubor1.txt"); ofstream to("soubor2.txt"); } char ch; while(from.get(ch)) to.put(ch); from.close(); to.close();
Způsoby čtení ze souboru char znak; char text[50]; ifstream in; in.open("pokus.txt"); in.get(znak); in >> text; in.getline(text,50); in.read(text, 50); in.close(); //precte znak //precte slovo //precte radek //precte zvoleny pocet znaku while (in.get(znak)){} //dokud jsou v souboru znaky
Režimy práce se souborem Slouží k nastavení režimu čtení nebo zápisu. Příklad syntaxe: ofstream out; out.open("pokus.txt",ios_base::app...); in otevře soubor pro čtení (výchozí pro čtení, není nutné psát). out otevře soubor pro zápis (výchozí pro zápis, není nutné psát). ate po otevření hledej konec souboru. app přidej text na konec souboru. trunc zkrat existující soubor na nulovou délku. binary binární režim.
Binární soubory Nedají se normálně číst, zapisují data ve formátu jako jsou v paměti. Problém s přenosem těchto souborů mezi platformami. Kladem je vyšší rychlost práce.
Zápis do binárního souboru Pro zápis do binárního souboru lze použít nap. funkci write. Kopíruje určitý počet bajtů (znaků) od pozice, na kterou ukazuje ukazatel. int pole[4]={1,2,3,4}; ofstream out; out.open("vystup.dat", ios_base::binary); if (out.is_open()) { out.write((char *)pole, sizeof(pole)); // pretypovani out.close(); } else cout << "Nepodarilo se otevrit soubor!" << endl;
čtení z binárního souboru Používá se funkce read: read (const char *buf, streamsize poet); char pole[4]; ifstream in; in.open("vstup.dat",ios_base::binary); if (out.is_open()) { in.read((char *)pole, sizeof(pole)); //pretypovani in.close(); } else cout << "Nepodarilo se otevrit soubor! \n";
Skoky v souboru seekg(position) skok na pozici ve výstupním proudu. seekp(position) skok na pozici ve vstupním proudu. seekg(skok, pozice) skok o zadaný počet bytů (vst.). seekp(skok, pozice) skok o zadaný počet bytů (vyst.). Identifiktory pozice: beg začátek souboru. end konec souboru. cur aktuální pozice. Příklad: in.seekg(20, ios_base::beg); //20 bajtu od zacatku
XML soubory XML je jednoznačný trend v oblasti přenosu a ukládní dat. Proč je XML tak zajímavé/používané? <?xml version="1.0" encoding="iso-8859-1"?> <notes> <note> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don t forget me this weekend!</body> </note> <note>... </note> </notes>
XML soubory Existuje řada metod pro zpracování XML (SAX, SAX2, DOM, XMLWriter,...). Nejvznamnějšími z těchto metod jsou verze SAX a DOM parserů. Pro C/C++ existují knihovny, které umožňují automatické zpracování XML: libxml2, Xerxes, expat, Arabica, aj. (http://www.ibm.com/developerworks/xml/library/ x-ctlbx.html) Osobně považuji práci s XML v C++ za méně komfortní.