Strona główna » C++ » Kurs » Odczyt danych - operator >>
 

Odczyt danych - operator >>

To nie jest trudne!

Obsługa wczytywania danych z pliku przy pomocy >> niewiele się różni od wczytywania danych z konsoli. Zarówno konsola jak i plik to strumień danych. Dla konsoli wczytanie danych to cin. Innymi słowy, aby wczytać dane z pliku musimy zadeklarować nowy strumień - dajmy na to file i zamiast cin używać file.

Zadanie

Dany jest plik w którym w każdej linijce znajduje się liczba całkowita, spacja, operator - pojedynczy znak, spacja, liczba całkowita, przykładowo:

  1. 2 + 3
  2. 2 * 2
  3. 1 - 2

wypisze na konsoli:

  1. 2+3=5
  2. 2*2=4
  3. 1-2=-1

Zadanie polega na wczytaniu każdej linijki danych i obliczenia wyrażenia. Wczytane równanie i wynik powinniśmy wypisać na konsoli. Możemy założyć, że operatorem może być tylko +, -, *, które oznaczają kolejno: dodawanie, odejmowanie i mnożenie. Dane na wejściu są poprawne.

Rozwiązanie

Funkcja pomocnicza - doMath()

Przed rozpoczęciem pisania głównej funkcji warto napisać funkcję pomocniczą doMath(). Jako argumenty przyjmie dwie liczby całkowite a, b oraz znak c. c jest to operator, który będzie określał programowi operację do wykonania: dodawanie, odejmowanie czy mnożenie.

  1. int doMath(int a, int b, char c){
  2.   switch(c){
  3.     case '+': return a + b;
  4.     case '-': return a - b;
  5.     case '*': return a * b;
  6.   }
  7. }
  1. int doMath(int a, int b, char c){
  2.  switch(c){
  3.   case '+': return a+b;
  4.   case '-': return a-b;
  5.   case '*': return a*b;
  6.  }
  7. }

(2.) Korzystamy z funkcji switch, aby uniknąć masy mnóstwa instrukcji if. (3. - 5.) Wykonujemy wskazaną operację i zwracamy wynik.

Funkcja main()

Do stworzenia strumienia potrzebny jest typ ifstream, który można zadeklarować po dołączeniu biblioteki fstream.

  1. int main() {
  2.   ifstream file;
  3.   file.open("exercise.txt");

(2.) Deklaracja zmiennej typu ifstream. Jest to zmienna do której będzie można się się odwoływać, aby wczytać dane z pliku. Jednak program nie wie, który plik ma wczytać, dlatego (3.) należy wywołać metodę open i podać nazwę pliku do otworzenia.

  1.   if(file.good()) {

Do sprawdzenia czy udało się otworzyć plik służy funkcja good(). W przypadku, gdy wystąpił błąd podczas otwierania to funkcja zwróci false, w przeciwnym wypadku true.

  1.     while(file.good()) {
  2.       int a, b;
  3.       char znak;
  4.       file >> a >> znak >> b;
  5.       cout << a << znak << b << "="
  6.       cout << doMath(a, b, znak) << endl;
  7.     }

Funkcja good() przyjmie również wartość false kiedy zostanie osiągnięty koniec pliku, dlatego (5.) określone operacje można wykonywać w pętli while. (6., 7.) Tworzenie tymczasowych zmiennych mają za zadanie przechować odczytane dane. (8.) Operator >> na zmiennej strumienia pliku przekazuje dane z strumienia pliku do zmiennej. Tu wystarczy pamiętać jak działa wczytywanie z konsoli, aby przewidzieć zachowanie zmiennej file. (9. - 10.) Wypisanie całego równania wraz z rozwiązaniem.

  1.   } else {
  2.     cout << "Podany plik nie istnieje!";
  3.   }
  4.   system("PAUSE");
  5.   return 0;
  6. }

(12.) Jeśli jednak nie udało się otworzyć pliku to (13.) to należy wypisać stosowny komunikat. (15.) Dopiero po akcji użytkownika (16.) można przejść do zakończenie działania programu.

Zadania

Zadanie 1

Popraw kod tak, aby obsługiwał wczytywanie liczb rzeczywistych oraz dodaj nowy operator dzielenia /.