400 Bad Request

Bad Request

Your browser sent a request that this server could not understand.

C++ Souborové Datové Proudy (I/O File Stream)

C++ Souborové Datové Proudy (I/O File Stream)

Příspěvekod Wlezley » 30 září 2011 01:11:22

Pro zápis do souboru a čtení ze souboru pomocí datových proudů, používáme následující třídy:
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;
}
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU

Zpět na C/C++

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 2 návštevníků


cron