
//
// To jest przykładowy kod z podrozdziału 11.3.2 „Pliki binarne” książki 
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include "std_lib_facilities.h"

//------------------------------------------------------------------------------

template<class T>
char* as_bytes(T& i)    // Traktuje T jako sekwencję bajtów.
{
    void* addr = &i;    // Pobiera adres pierwszego bajta
    // w pamięci, w której został zapisany obiekt.
    return static_cast<char*>(addr); // Traktuje tę pamięć jako bajty.
}

//------------------------------------------------------------------------------

int main()
try
{
    // Otwieramy strumień istream w binarnym trybie odczytu pliku:
	cout << "Podaj nazwę pliku wejściowego:\n";
    string name;
    cin >> name;
    ifstream ifs(name.c_str(),ios_base::binary);    // Uwaga: tryb strumienia
    // „binary” oznacza dla niego, że ma się za bardzo nie ciekawić znaczeniem bajtów.
    if (!ifs) error("Nie można otworzyć pliku wejściowego ", name);

    // Otwieramy strumień ostream w binarnym trybie do zapisu:
    cout << "Podaj nazwę pliku wyjściowego:\n";
    cin >> name;
    ofstream ofs(name.c_str(),ios_base::binary);    // Uwaga: tryb strumienia
        // „binary” oznacza dla niego, że ma się za bardzo nie ciekawić znaczeniem bajtów.
    if (!ofs) error("Nie można otworzyć pliku wyjściowego ",name);

    vector<int> v;

    // Odczyt z pliku binarnego:
    int i;
    while (ifs.read(as_bytes(i),sizeof(int))) // Uwaga: wczytywanie bajtów.
        v.push_back(i);    

    //  operacje przy użyciu v

    // Zapisywanie do pliku binarnego:
    for(int i=0; i<v.size(); ++i)
        ofs.write(as_bytes(v[i]),sizeof(int));    // Uwaga: zapisywanie bajtów.
    return 0;
}
catch (exception& e) {
	cerr << "Błąd: " << e.what() << '\n'; 
    return 1;
}
catch (...) {
    cerr << "Nieznany wyjątek.\n"; 
    return 2;
}

//------------------------------------------------------------------------------
