Obsługa plików

Poniżej zamieszczono przykładowy program ilustrujący zapis i odczyt plików w języku C++ zarówno w trybie tekstowym, jak i binarnym.

#include <iostream>
#include <fstream> /* Nagłówek niezbędny dla obsługi plików */
 
int main()
{
    using namespace std;
    /* Ścieżka względna do pliku - plik będzie utworzony
       w katalogu startowym programu. 
       Można również podać ścieżkę bezwzględną, np.
       sciezka[] = "c:/dane/kontakty.txt" lub sciezka[] = "c:\\dane\\kontakty.txt"
       */ 
    const char sciezka[] = "kontakty.txt";
    /* Klasa std::ostream służy do zapisu plików.
       Domyślny konstruktor tworzy plik, jeżeli takowy nie istnieje albo nadpisuje
       istniejący plik usuwając poprzednią zawartość (!)
    */
    ofstream plik_z(sciezka);
    if (plik_z.is_open()) { // Metoda is_open zwraca true, gdy otwarcie pliku powiodło się
        // Wpisz do pliku przykładowe dane
        plik_z << "Anna Nowak" << endl
               << 20 << endl;
        plik_z.close(); // Skończyliśmy używać plik, zamykamy
    }     
 
    /* Klasa std::ifstream służy do odczytu pliku, domyślny konstruktor otwiera
       plik do odczytu w trybie tekstowym, co skutkuje m.in. automatyczną
       konwersją pary znaków kończących wiersz \r\n (CR + LF) na pojedynczy znak \n
       w przypadku systemu Windows.
    */
    ifstream plik_o(sciezka);
    if (plik_o.is_open()) {
        // 1. Sposób odczytu - wiersz po wierszu
        string wiersz;
        while( getline(plik_o, wiersz) ) {
            cout << wiersz << endl;
        }
        cout << "Czy koniec pliku: " << plik_o.eof() << endl;
        // Gdy bit oznaczający koniec pliku jest ustawiony (eof() == 1) to
        // wszystkie operacje na strumieniu będą ignorowane, aż do jego
        // wyzerowania
        plik_o.clear(); // Zeruje bity eofbit, failbit i badbit
        // Kursor po odczycie znajduje się za ostatnim znakiem
        cout << "Pozycja kursora w pliku: " << plik_o.tellg() << endl;
 
        plik_o.seekg(0); // Przesuń kursor na początek pliku
 
        // 2. Sposób odczytu - formatowany
        string imie, nazwisko;
        int wiek;
        plik_o >> imie >> nazwisko >> wiek; // wczytuj do podanych zmiennych
        cout << "Wczytałem: " << imie << " " << nazwisko << " " << wiek << endl;
        plik_o.close();
 
        // 3. Sposób - odczyt znak po znaku
        plik_o.open(sciezka, ios::binary); // binary wyłącza konwersję CR+LF -> \n w Windows
        char z;
        while ( plik_o.get(z) ) { // Odczyt znak po znaku, nie pomija spacji
            cout << z;
        }
        plik_o.close();
    }
 
    // Dopisz dane do istniejącego pliku
    const char tel[] = "123-456-789"; 
    plik_z.open(sciezka, ios::app); // Otwórz w trybie dopisywania
    plik_z << tel;
    plik_z.close();
 
    // Klasa std::fstream pozwala zarówno na odczyt, jak i zapis danych
    fstream plik_oz(sciezka);
    string imie, nazwisko, nr_tel;
    int wiek;
    plik_oz >> imie >> nazwisko >> wiek >> nr_tel; // Odczyt formatowany
    cout << "Wczytałem: " << imie << " " << nazwisko << " " << wiek << " " << nr_tel << endl;
    // Ups, nr tel. jest błędny - cofnij pozycję w pliku i nadpisz
    streampos poz = plik_oz.tellp(); // pobierz aktualną pozycję kursora w pliku
    cout << "Aktualna pozycja kursora w pliuk: " << poz << endl;
    poz -= nr_tel.size(); // zmniejsz pozycję o liczbę znaków z których składa się nr tel.
    plik_oz.seekg(poz);   // cofnij za pomocą metody seekg
    // zamiast powyższego wystarczy: plik_oz.seekg(-int(nr_tel.size()), plik_oz.cur)
    plik_oz << "123-456-777" << endl; // nadpisz stary nr tel. nowym
    plik_oz.close();
 
    int liczby[] = { 1, 2, 3 };
    // Zapis binarny do pliku wymaga otwarcia go w trybie ios::binary
    ofstream bin_z("liczby.dat", ios::binary);
    if (bin_z.is_open()) {
        // Zapisz całą tablicę jako ciąg bajtów (char), drugi par. to liczba
        // bajtów do zapisu
        bin_z.write( (char *)liczby, 3 * sizeof(int) );
        bin_z.close();
    }     
 
    // Odczyt danych binarnych
    ifstream bin_o("liczby.dat", ios::binary);
    if (bin_o.is_open()) {
        // Odczytaj całą tablicę jako ciąg bajtów (char), drugi par. to liczba
        // bajtów do odczytu
        int liczby2[3] = { 0 };
        bin_o.read((char *)liczby2, 3 * sizeof(int));
        bin_o.close();
        for (int i = 0; i < 3; ++i) {
            cout << liczby2[i] << endl;
        }
    }
    return 0;
}

Post a Comment

Your email is kept private. Required fields are marked *

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>