Operacje na plikach – początki

Październik 05, 2012

Chcielibyśmy stworzyć prosty program który zapisze nam dane kolejno wprowadzanych osób (imię, nazwisko, wiek) a następnie pozwoli nam te dane wyświetlić celem przejrzenia wpisów. Póki co trzymamy się jeszcze programów konsolowych, więc nie ma problemu z GUI – jedyne co trzeba zrobić to w prosty sposób zaimplementować wybór opcji. Na razie zrobimy uproszczoną wersję programu – jedno uruchomienie jedna operacja.
Przykładowy kod źródłowy programu mógłby wyglądać następująco:

code8.cpp

#include <iostream>

using namespace std;
int main()
{
  char opcja = '\0';

  cout << "Wybierz opcje:" << endl << "1. Dodaj nowa osobe" << endl 
       << "2. Wyswietl liste osob wpisanych" << endl;
  opcja = cin.get();
  if (opcja == '1')
    {
    cout << "Wprowadz dane nowej osoby:";    
    }
  else if (opcja == '2')
    {
    cout << "Lista osob:";     
    }
    
  fflush(stdin);  
  cin.get();
  return 0;
} // main

Jedyne co może wymagać wyjaśnienia na tym etapie to obecność linii:
fflush(stdin);
która odpowiada za wyczyszczenie bufora klawiatury. Bez niej moglibyśmy mieć problemy przy wywołaniu po raz drugi cin.get(), które pobrałoby wartość z bufora, a więc wartość z poprzedniego odczytu (niedowierzający mogą to sprawdzić sami).

Potrzebujemy stworzyć klasę Osoba, która na początku umożliwi nam przechowywanie poszczególnych obiektów podczas wprowadzania ich do programu oraz udostępni nam zbiór metod, które będą odpowiadały za późniejsze przetwarzanie danych w programie. Klasę Osoba przygotowywaliśmy już wcześniej, więc nie będę jej szczegółowo omawiał, choć spostrzegawczy czytelnik z pewnością zauważy, że wystąpiły pewne różnice między wyglądem klasy poprzednio a obecnie. Póki co skupmy się tylko na dopisywaniu nowych osób do pliku. Plik będzie nazywał się Code9.txt i będzie się znajdował w tym samym miejscu co odpalany program. Do przetwarzania plików w C++ można użyć wielu różnych sposobów, my skorzystamy z grupy funkcji fstream. Aby otworzyć plik należy wywołać metodę
open()
podając jako pierwszy parametr nazwę pliku. Drugi parametr jest opcjonalny, w naszym wypadku dodamy parametr fstream::app oznaczający mechanizm append czyli do pliku dopiszemy nową treść za już istniejącymi wpisami (gdybyśmy nie podali drugiego parametru za każdym razem nadpisywalibyśmy istniejący plik).
Korzystanie z fstream do przetwarzania plików daje nam możliwość wykorzystania możliwości strumieni, dzięki czemu możemy korzystać z operatorów „<<” oraz „>>”, które do tej pory były używane przy okazji wyświetlania czegoś na ekranie konsoli. Po wykonaniu operacji MUSIMY zamknąć plik – jak łatwo się domyślić będzie służyła temu metoda
close()
Użyliśmy jeszcze jednego ciekawego mechanizmu, na potrzeby podglądu pliku używamy polecenia system, które jest równoważne wpisaniu komendy do okna konsoli. W następnej części oczywiście będziemy rozbudowywali program przez możliwość wielokrotnego wywoływania głównego menu oraz o dodanie interpretacji pliku do okna. Później można dodać jeszcze opcje usuwania wpisów w pliku oraz np. możliwość generowania pliku wynikowego w różnych formatach.
Poniżej plik źródłowy aktualnej wersji programu:

code9.cpp

#include <iostream>
#include <fstream>

using namespace std;

class Osoba
{
  private: 
    string imie;
    string nazwisko;
    int wiek;
  
  public: 
    Osoba(void);
    void DodajImie(string _imie); 
    void DodajNazwisko(string _nazwisko); 
    void DodajWiek(int _wiek);         
    void Zapisz(void);
};

Osoba::Osoba(void)
{
  //wypełnia danymi przykładowymi:
  this->imie = "Jan";
  this->nazwisko = "Kowalski";
  this->wiek = 21;
} // ::Osoba

void Osoba::DodajImie(string _imie)
{
  this->imie = _imie;
} // ::DodajImie

void Osoba::DodajNazwisko(string _nazwisko)
{
  this->nazwisko = _nazwisko;
} // ::DodajNazwisko

void Osoba::DodajWiek(int _wiek)
{
  this->wiek = _wiek;
} // ::DodajWiek

void Osoba::Zapisz()
{
  ofstream plik;
  plik.open("Code9.txt", fstream::app);
  
  plik << this->imie << ";" << this->nazwisko << ";" << this->wiek << ";" << endl;
  
  plik.close();
} // ::Zapisz

int main()
{
  char opcja = '\0';

  cout << "Wybierz opcje:" << endl << "1. Dodaj nowa osobe" << endl << "2. Wyswietl liste osob wpisanych" << endl;
  opcja = cin.get();
  if (opcja == '1')
    {
    cout << "Wprowadz dane nowej osoby:" << endl;   
    Osoba nowa = Osoba();   
    string str; 
    int val; 
    
    cout << "Podaj imie:" << endl;
    cin >> str;
    nowa.DodajImie(str);

    cout << "Podaj nazwisko:" << endl;
    cin >> str;
    nowa.DodajNazwisko(str);
    
    cout << "Podaj wiek:" << endl;
    cin >> val;
    nowa.DodajWiek(val);   
    
    nowa.Zapisz(); 
    }
  else if (opcja == '2')
    {
    system("Code9.txt");    
    }
    
  fflush(stdin);  
  cin.get();
  return 0;
} // main


Pobierz pliki
Ostatnie wpisy
image
Październik 05, 2012

Operacje na plikach - cześć pierwsza zapis do pliku

image
Wrzesień 20, 2012

Trzy Korony, 982 m.n.p.m., Pieniny

image
Wrzesień 20, 2012

Mechanizm dziedziczenia - czyli podstawy programowania obiektowego