● ofstream - pro výstupní souborové operace
● ifstream - pro vstupní souborové operace
● fstream - pro vstupní a výstupní souborové operace
Tyto třídy jsou odvozeny (přímo nebo nepřímo) ze základních tříd pro standardní vstup a výstup ios, istream a ostream.
Pro práci se vstupy a výstupy souborových datových proudů, je třeba deklarovat #include <fstream>.
Dále berte na vědomí, že třídy ofstream, ifstream a fstream jsou členy jmenného prostoru std.
Zápis do souboru
● Protože zápis do souboru je výstup, vytvoříme proměnnou typu ofstream (pro výstupní souborové operace)
● Soubor otevřeme metodou open() které předáme jméno souboru
● Otevření souboru (přiřazení k datovému proudu) můžeme také provést již při deklaraci: ofstream muj_ofs("jmeno_souboru.txt");
● Úspěšnost otevření souboru můžeme pohodlně ověřit pomocí metody fail(), která vrací pravdivou hodnotu (true) pokud bylo otevření souboru neúspěšné
● Pro zápis dat do datových proudů používáme operátor <<
● Soubor uzavřeme pomocí metody close()
- Kód: Vybrat vše
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream ofs; // Vytvoření datového proudu
ofs.open("soubor.txt"); // Otevření výstupního souboru
if (ofs.fail()) // Ověření úspěšnosti otevření výstupního souboru
{
cout << "Nelze otevrit vystupni soubor!\n";
return 1;
}
ofs << "Text, ktery se zapise do souboru ..." << endl; // Zápis do proudu
ofs.close(); // Uzavření souboru
return 0;
}
Čtení ze souboru
● Pro čtení ze souboru vytvoříme proměnnou typu ifstream (pro vstupní souborové operace)
● Soubor otevřeme metodou open() které předáme jméno souboru
● Otevření souboru (přiřazení k datovému proudu) můžeme také provést již při deklaraci: ifstream muj_ifs("jmeno_souboru.txt");
● Úspěšnost otevření souboru můžeme ověřit metodou fail() (viz. výše - "Zápis do souboru")
● Pro čtení (výběr) dat z datových proudů používáme operátor >>
● Soubor uzavřeme pomocí metody close()
- Kód: Vybrat vše
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int x = 0, y = 0;
ifstream ifs; // Vytvoření datového proudu
ifs.open("soubor.txt"); // Otevření vstupního souboru
if (ifs.fail()) // Ověření úspěšnosti otevření vstupního souboru
{
cout << "Nelze otevrit vstupni soubor!\n";
return 1;
}
ifs >> x >> y; // Čtení (výběr) dat z proudu
ifs.close(); // Uzavření souboru
return 0;
}
Diagnostika
Když jsem se zmínil o metodě fail(), měl bych Vám přiblížit i ostatní metody, které slouží k diagnostice I/O:
● fail() - vrací true v případě, že byla operace neúspěšná (otevření souboru, zápis do souboru, čtení ze souboru, atd..)
● good() - vrací true v případě, že byla operace úspěšná, tedy opačnou hodnotu než fail()
● eof() - vrací true v případě, že se proud nachází na konci souboru (týká se jen čtení ze souboru)
Anulace chybového stavu proudu
Pokud byla předchozí operace neúspěšná (metoda fail() vrátí true) je další čtení/zapisování z/do datového proudu pozastaveno, takže selžou všechny operace které se o to pokusí. Tento chybový stav musíme odstranit voláním metody clear(), teprve potom můžeme provádět další operace čtení a (nebo) zápisu.
- Kód: Vybrat vše
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int x;
string s;
ifstream ifs;
ifs.open("soubor.txt");
// Nasledující pokus o načtení čísla bude neúspěšný (například protože ve vstupním souboru se nachazejí nečíselné znaky)
ifs >> x;
if(ifs.fail())
cout << "Pri cteni celeho cisla nastala chyba!\n";
else
cout << "Cele cislo ziskane ze souboru: " << x << endl;
// Voláním clear() anulujeme chybový stav datového proudu
ifs.clear();
// Nyní načteme textový řetězec. Pokud bysme předtím nezavolali clear() žádný text by se nenačetl, protože datový proud by byl v chybovém stavu.
ifs >> s;
cout << "Textovy retezec ziskany ze souboru: " << s << endl;
ifs.close();
return 0;
}