C++ kurs podstawy programowania. Praca z plikami tekstowymi, zapis.

Dzisiaj poznamy bardzo przydatną rzecz a mianowicie nauczymy się odczytywać dane (tekst) z plików. To bardzo przydatna umiejętność. Pliki tekstowe mogą nawet służyć jako takie mini bazy danych więc sam widzisz, że umiejętność pracy z plikami tekstowymi jest naprawdę ważna i przydatna. Zaczynamy!

Startujemy oczywiście z poziomu pustego projektu Hello world! (listing poniżej).

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}

Stworzymy plik, który kiedyś wykorzystamy do stworzenia programu do nauki języka angielskiego. Będzie on przechowywał w kolejnych liniach najpierw słówko angielskie a w następnej linii jego polskie tłumaczenie. Nazwa pliku będzie odwoływała się do kategorii słówek, które będą się znajdowały wewnątrz pliku. Na początek stworzymy plik, który będzie przechowywał słówka do nauki zwierząt.

Żeby w ogóle pracować z plikami tekstowymi musimy dodać do naszego projektu bibliotekę poleceniem include.

#include <fstream>

Tą linię dodajemy poniżej dodanej biblioteki iostream (poniżej pierwszej linii).

Teraz możemy utworzyć zmienna plikową typu fstream, która będzie nam służyła do odwoływania się do naszego pliku. Tak jak do zapisywania ciągów znaków wykorzystujemy zmienną o typie string tak dla plików tworzymy zmienną plikową o dowolnej nazwie typu fstream.

fstream moj_plik;

Następnie musimy podać komputerowi lokalizację naszego pliku i w jakim trybie chcemy do otworzyć, bo możemy otworzyć plik albo do zapisu albo do odczytu, w sumie logiczne jeżeli chcemy coś do pliku zapisać/lub dopisać albo chcemy coś z niego odczytać. Poniżej kod.

moj_plik.open("zwierzeta.txt",ios::out);

Funkcja open() służy do otwierania pliku. Pierwszy argument w nawiasach, u nas zwierzeta.txt, mówi o ścieżce dostępu do pliku, czyli o lokalizacji pliku na dysku. Tutaj jest tylko sama nazwa pliku więc code::blocks będzie szukał naszego pliku w katalogu z projektem. Co oznacza parametr ios::out. Słówko  ios znaczy input output stream czyli zaznaczamy, że chodzi nam o strumień danych, out oznacza, że ten strumień danych chcemy wyprowadzić z programu do pliku. Znak :: to operator zasięgu mówi tylko tyle, że funkcja out jest częścią składową klasy ios.

Funkcja open() przy próbie otwarcia pliku działa jeszcze w jeden sposób. Sprawdza ona czy w podanej lokalizacji (pierwszy parametr) znajduje się plik o wskazanej przez nas nazwie. Jeżeli tak to otworzy ten plik do zapisu, a jeżeli nie to najpierw utworzy taki plik i otworzy go do zapisu. Fajnie, nawet nie musimy się za bardzo martwić, co w sytuacji kiedy naszego pliku nie ma we wskazanej lokalizacji, funkcja open() załatwi to za nas.

Żeby „wrzucić” jakieś dane do pliku utworzymy sobie dwie zmienne pomocnicze które będą nam przechowywały słówko w języku angielskim i jego tłumaczenie po polsku podane przez użytkownika.

string slowkoen, slowkopl;

Zmienne tworzymy pomiędzy using namespace std; a funkcją main().

Teraz poprosimy użytkownika o wprowadzenie z klawiatury słówka angielskiego i jego polskiego tłumaczenia.

    cout << "Slowko angielskie: ";
    cin >> slowkoen;
    cout << "Polskie tlumaczenie: ";
    cin >> slowkopl;

Czyli w zmiennych slowkoen i slowkopl mamy już słówka które chcemy zapisać w pliku. No to zapisujemy. Sprawa jest bardzo prosta.

    moj_plik << slowkoen << endl;
    moj_plik << slowkopl << endl;

Na początku odwołujesz się do Twojego pliku poprzez zmienną plikową mój_plik a później „wyprowadzasz” z programu dane z tych zmiennych do pliku. Zwróć uwagę, że na końcu każdej linii wywołujemy funkcję endl() („end line”, czyli koniec linii). Gdybyśmy tego nie zrobili to wszystkie dane, angielskie i polskie słówko, zapisałoby się do pliku w jednej linii.

Dodatkowo możemy wyświetlić użytkownikowi komunikat o tym, że słówka zostały zapisane do pliku.

cout << "Slowka zapisane" << endl;

W momencie kiedy już nie będziemy korzystać z pliku należy zamknąć plik.

moj_plik.close();

Cały nasz kod będzie wyglądał jak poniżej.

 

#include <iostream>
#include <fstream>

using namespace std;

string slowkoen, slowkopl;

int main()
{
    fstream moj_plik;
    moj_plik.open("zwierzeta.txt",ios::out);

    cout << "Slowko angielskie: ";
    cin >> slowkoen;
    cout << "Polskie tlumaczenie: ";
    cin >> slowkopl;

    moj_plik << slowkoen << endl;
    moj_plik << slowkopl << endl;
    cout << "Slowka zapisane" << endl;

    moj_plik.close();

    return 0;
}

Po uruchomieniu program pyta użytkownika o podanie słówka angielskiego

cpp c++ kurs podstawy programowania, progarmowanie obiektowe

Po jego podaniu i potwierdzeniu enterem program pyta nas o polskie tłumaczenie podanego słówka.

cpp c++ kurs podstawy programowania, progarmowanie obiektowe

 

Po podaniu polskiego słówka, program wyświetla komunikat do użytkownika, że słówko jest dodane i kończy pracę. Oczywiście code::blocks wyświetla jeszcze swoje powiadomienie o czasie wykonania programu i czeka na wciśnięcie jakiegoś klawisza z klawiatury.

cpp c++ kurs podstawy programowania, progarmowanie obiektowe

Widzimy, że w konsoli wszystko poszło zgodnie z planem, ale czy utworzyliśmy pliki i czy znajdują się w nim dane które wprowadziliśmy. Zobaczmy w katalogu z projektem czy istnieje plik o nazwie zwierzęta.txt.

cpp c++ kurs podstawy programowania, progarmowanie obiektowe

Widzimy, że w katalogu naszego projektu znajduje się plik zwierzęta.txt czyli wszystko wygląda dobrze. Teraz zostało nam do sprawdzenia czy po otwarciu pliku dane które wysłaliśmy do pliku się zapisały.

cpp c++ kurs podstawy programowania, progarmowanie obiektowe

Wszystko zadziałało prawidłowo, w pliku znajdują się dwie linie z zapisanymi słówkami. Ktoś jednak przytomnie spyta co się stanie w przypadku ponownego uruchomienia programu. Czy program dopisze dane do pliku czy je nadpisze. No to uruchamiamy program jeszcze raz.

cpp c++ kurs podstawy programowania, progarmowanie obiektowe

Sprawdzamy co się dzieje w pliku.

cpp c++ kurs podstawy programowania, progarmowanie obiektowe

Widzimy więc, że każde uruchomienie programu powoduje nadpisanie wcześniej wprowadzonych danych. Czy możemy coś z tym zrobić? Oczywiście, że tak. W miejscu gdzie określamy w jakim trybie otwieramy nasz plik musimy dodać parametr mówiący o tym, że chcemy dopisywać dane a nie zastępować. Wystarczy do linii

moj_plik.open("zwierzeta.txt",ios::out);

dodać parametr

moj_plik.open("zwierzeta.txt",ios::out | ios::app);

Sprawdźmy czy działa. Aktualnie w naszym pliku mamy dodanego psa. No to nie może zabraknąć także kota. Uruchamiamy program i dodajemy słówka cat / kot.

cpp c++ kurs podstawy programowania, progarmowanie obiektowe

Sprawdźmy co się stało w naszym plik. Otwieramy plik zwierzęta.txt.

cpp c++ kurs podstawy programowania, progarmowanie obiektowe

Bingo! Pod słówkami dotyczącymi psa dodały się dwie linie dotyczące kota. Oto właśnie nam chodziło. Widzisz więc, że zapisywanie danych do pliku tekstowego to nic trudnego. Finalnie nasz kod przybierze postać.

#include <iostream>
#include <fstream>

using namespace std;

string slowkoen, slowkopl;

int main()
{
    fstream moj_plik;
    moj_plik.open("zwierzeta.txt",ios::out | ios::app);

    cout << "Slowko angielskie: ";
    cin >> slowkoen;
    cout << "Polskie tlumaczenie: ";
    cin >> slowkopl;

    moj_plik << slowkoen << endl;
    moj_plik << slowkopl << endl;
    cout << "Slowka zapisane" << endl;

    moj_plik.close();

    return 0;
}

W kolejnych częściach kursu nauczysz się odczytywać te dane z pliku.


c++ kurs programowania obiektowego spis treści