Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Vstupn´ı a vstupn´ı proudy v C++ Programovac´ı jazyk C++
David Proch´azka ´ MZLU - PEF - Ustav informatiky
11. ˇr´ıjna 2007
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Vstup na termin´al a ˇcten´ı z nˇej Pouˇz´ıv´a se knihovna iostream. Pro v´ystup lze pouˇz´ıt standardn´ı v´ystup – cout. nebo chybov´y v´ystup – cerr. Pro naˇcten´ı vstupn´ıho ˇretˇezce standardn´ı vstup – cin. #include int main(void){ int cislo; cout << "Napis cislo" << endl; cin >> cislo; cout << "Napsal jsi: " << cislo << endl; cerr << "Nastala neznama chyba" << endl; return 0; }
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Pˇresmˇerov´an´ı proud˚ u na u´rovni OS pˇresmˇeruj v´ypis pˇr´ıkazu do souboru – ls>jmenoSouboru.txt pˇresmˇeruj standardn´ı v´ystup – program 1>jmenoSouboru.txt pˇresmˇeruj chybov´y v´ystup – program 2>jmenoSouboru.txt zahod’ chybov´y v´ystup – program 2>\dev\null pˇresmˇeruj chybov´y v´ystup na standardn´ı – 2>&1
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Parametry funkce main Programu je obˇcas potˇreba pˇredat parametry (format c:). V C++ mus´ıme deklarovat parametry funkce main n´asleduj´ıc´ım zp˚ usobem: 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ˇcet pametr˚ u, kter´e byly pˇred´any +1. Promn argv je pole ˇretˇezec˚ u, kde kaˇzd´a buˇ nka obsahuje parametr. K parametr˚ um pˇristupujeme klasicky – argv[1], argv[2], ... Parametry jsou ˇc´ıslov´any od jedniˇcky! argv[0] je jm´eno programu. David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Manipul´atory – n´astroje pro pr´aci s proudem Pro manipul´atory s parametrem je potˇreba pouˇz´ıt knihovnu iomanip. endl – konec ˇr´adku a vypr´azdni buffer. flush – vypr´azdni buffer. dec, hex, oct – v´ypis ˇc´ısel v destkov´e, ˇsestn´actkov´e, osmiˇckov´e soustavˇe. setw(x) – poˇcet znak˚ u na kter´e bude zarovn´ano. setfill("x") – jak´ym znakem bude vyplˇ nov´ano. #include #include int main(void) { int c = 1000, b = 9; cout<<setw(3)<<"b="<
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
GetLine – naˇcten´ı cel´e ˇr´adky ˇ cel´e ˇr´adky, ne jen do prvn´ıho b´ıl´eho znaku. Cte M´a 3 parametry: ˇretzec, maxim´aln´ı poˇcet znak˚ u a ukonˇcovac´ı znak ˇr´adku. Ukonˇcovac´ı znak je implicitnˇe nastaven na \n. #include int main(void) { char s[100]; cout << "Napis retzec" << endl; cin.getline(s,99); cout << "Napsal jsi " << s <<endl; return 0; }
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Z´apis do souboru Pracujeme tak´e s proudy i metody ˇcten´ı jsou stejn´e. Mus´ıme naˇc´ıst knihovni fstream. V´ystupn´ı proud pak deklarujeme jako ofstream. #include #include int main(){ ofstream out; out.open("temp.txt"); for(int i=1;i<=10;i++) { out << i << endl; } }
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Kontrola z´apisu do souboru Vˇzdy je vhodn´e kontrolovat, zda se povedlo soubor otevˇr´ıt (vytvoˇrit). #include #include int main(){ ofstream out; out.open("pokus.txt"); if (out.is_open()) { out << "radka textu"; out.close(); } else cout << "Soubor se nepodarilo nacist..."; }
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
ˇ ı ze souboru Cten´ Opˇet mus´ıme naˇc´ıst knihovni fstream. Vstupn´ı proud pak deklarujeme jako ifstream. #include #include int main(){ string slovo; ifstream in; in.open("temp.txt"); if (in.is_open()) { while(in >> slovo) cout << slovo << " "; cout << endl; } }
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Trivi´aln´ı 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(); }
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Zp˚ usoby ˇcten´ı 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 //precte //precte //precte
while (in.get(znak)){}
znak slovo radek zvoleny pocet znaku
//dokud jsou v souboru znaky
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Reˇzimy pr´ace se souborem Slouˇz´ı k nastaven´ı reˇzimu ˇcten´ı nebo z´apisu. Pˇr´ıklad syntaxe: ofstream out; out.open("pokus.txt",ios_base::app|...); in – otevˇre soubor pro ˇcten´ı (v´ychoz´ı pro ˇcten´ı, nen´ı nutn´e ps´at). out – otevˇre soubor pro z´apis (v´ychoz´ı pro z´apis, nen´ı nutn´e ps´at). ate – po otevˇren´ı hledej konec souboru. app – pˇridej text na konec souboru. trunc – zkrat’ existuj´ıc´ı soubor na nulovou d´elku. binary – bin´arn´ı reˇzim.
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Bin´arn´ı soubory Nedaj´ı se ”norm´alnˇe” ˇc´ıst, zapisuj´ı data ve form´atu jako jsou v pamˇeti. Probl´em s pˇrenosem tˇechto soubor˚ u mezi platformami. Kladem je vyˇsˇs´ı rychlost pr´ace.
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Z´apis do bin´arn´ıho souboru Pro z´apis do bin´arn´ıho souboru lze pouˇz´ıt nap. funkci write. Kop´ıruje urˇcit´y poˇcet bajt˚ u (znak˚ u) 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;
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
ˇcten´ı z bin´arn´ıho souboru Pouˇz´ıv´a 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";
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
Skoky v souboru seekg(position) – skok na pozici ve v´ystupn´ım proudu. seekp(position) – skok na pozici ve vstupn´ım proudu. seekg(skok, pozice) – skok o zadan´y poˇcet byt˚ u (vst.). seekp(skok, pozice) – skok o zadan´y poˇcet byt˚ u (vyst.). Identifiktory pozice: beg – zaˇc´atek souboru. end – konec souboru. cur – aktu´aln´ı pozice. Pˇr´ıklad: in.seekg(20, ios_base::beg); //20 bajtu od zacatku
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
XML soubory XML je jednoznaˇcn´y trend v oblasti pˇrenosu a ukl´adn´ı dat. Proˇc je XML tak zaj´ımav´e/pouˇz´ıvan´e? <notes> <note> Tove Jani Reminder Don’t forget me this weekend! <note> ... David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++
Termin´ al Textov´ y soubor Bin´ arn´ı soubor XML soubory
XML soubory Existuje ˇrada metod pro zpracov´an´ı XML (SAX, SAX2, DOM, XMLWriter, ...). Nejvznamnˇejˇs´ımi z tˇechto metod jsou verze SAX a DOM parser˚ u. Pro C/C++ existuj´ı knihovny, kter´e umoˇzn ˇuj´ı automatick´e zpracov´an´ı XML: libxml2, Xerxes, expat, Arabica, aj. (http://www.ibm.com/developerworks/xml/library/ x-ctlbx.html) Osobnˇe povaˇzuji pr´aci s XML v C++ za m´enˇe komfortn´ı.
David Proch´ azka
Vstupn´ı a vstupn´ı proudy v C++