Pliki wykład. Dorota Pylak

Podobne dokumenty
Pliki wykład. Dorota Pylak

Pliki wykład 2. Dorota Pylak

Pliki wykład 2. Dorota Pylak

Pliki wykład 2 -przekazywanie strumieni do funkcji -funkcje get(char &) i getline(string)

Programowanie w językach

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 24

Program dopisujący gwiazdkę na końcu pliku tekstowego o nazwie podanej przez uŝytkownika oraz wypisujący zawartość tego pliku.

Wykład 9 Pliki cz.3 (getline(string)) Typ wyliczeniowy enum

C++ - [3-5] Pliki i strumienie w C++

Operacje wejścia/wyjścia (odsłona druga) - pliki

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Wejście wyjście strumieniowe

Programowanie i struktury danych

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

1 Pierwsze kroki w C++ cz.3 2 Obsługa plików

Wykład 2 Operacje wejściawyjścia. Ewa Gajda

Operacje wejścia/wyjścia odsłona pierwsza

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Pliki. Operacje na plikach w Pascalu

Język C++ Różnice między C a C++

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Spis treści OBSŁUGA PLIKÓW W JĘZYKU C++ Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF32

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wstęp do informatyki- wykład 8 Pętla while, do while,for -pętla w pętli- przykłady Operator rzutowania Manipulatory

Część 4 życie programu

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Pytania sprawdzające wiedzę z programowania C++

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Język C++ wykład VIII

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

jest mocny, skoro da się w nim wyrazić nowe pojęcia; łatwiej przenieść go na nową platformę jest mniejszy.

Podstawy programowania skrót z wykładów:

C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony

Klasa iostream... 1 Klasy ofstream, ifstream Struktura FILE... 8

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Programowanie - wykład 4

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Podstawy programowania w C++

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Programowanie Obiektowe i C++

Wykład :37 PP2_W9

I - Microsoft Visual Studio C++

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

Pliki i manipulatory. - Łańcuchowe funkcje wejścia - getline(string) Dorota Pylak - Tryby otwarcia pliku - Formatowanie manipulatory

1 Strumienie. 2 Pliki. 2.1 Zapis do pliku tekstowego. Programowanie w j zyku C - Adam Krechowicz, Daniel Kaczmarski

Programowanie komputerowe. Zajęcia 1

Wstęp do programowania. Wykład 1

Wprowadzenie do programowania i programowanie obiektowe

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Pliki. Informacje ogólne. Obsługa plików w języku C

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

Dziedziczenie & W slajdach są materiały zapożyczone z

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Programowanie obiektowe

Wstęp do Programowania 2

Programowanie Procedurale. Pliki w języku C++

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Pliki. Informacje ogólne. Obsługa plików w języku C

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

po ostatnim dopisaniu na standardowe wyjście (cout) powinien zostać wyprowadzony komunikat "Skonczylem";

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

1 Podstawy c++ w pigułce.

Wykład PASCAL - Pliki tekstowe

C++ wprowadzanie zmiennych

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 25 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 38

4. Funkcje. Przykłady

Aby uzyskać zaliczenie w pierwszym terminie (do 30 stycznia 2018) rozliczyć trzeba co najmniej 8 projektów, po 4 z każdej z części: C++ oraz Python.

Podstawy Programowania

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Zadanie nr 3: Sprawdzanie testu z arytmetyki

Wstęp do informatyki- wykład 7

Funkcje zawarte w bibliotece < io.h >

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Operatory na rzecz typu TString

Podstawy Programowania Podstawowa składnia języka C++

Funkcje zawarte w bibliotece < io.h >

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++

Programowanie w językach wysokiego poziomu

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Ćwiczenie 2 Wczytywanie i zapisywanie do plików tekstowych

1 Powtórzenie wiadomości

Transkrypt:

Pliki wykład Dorota Pylak

Pliki 2 Większość programów komputerowych korzysta z plików, np. w edytorach tekstów tworzymy pliki dokumentów. Plik (ang. file) jest porcją danych zapisanych na jakimś nośniku. Pliki mogą zawierać dane z których chcemy korzystać w naszym programie - pliki danych lub możemy w nich zapisywać rezultaty - pliki wynikowe. Dzięki wykorzystaniu plików nie musimy wprowadzać wielokrotnie danych, a raz wprowadzone np. przy pomocy jakiegoś edytora używać wiele razy. Pliki wejścia/wyjścia mogą być otwierane w trybie tekstowym lub w trybie binarnym. Np. w formacie tekstowym, liczby są zapisywane, jako łańcuchy znaków, natomiast w formacie binarnym liczby są zapisywane tak jak w pamięci: cztery bajty na liczbę całkowitą (int) i osiem na liczbę zmiennoprzecinkową (double). Format tekstowy jest bardziej czytelny, pliki takie można edytować w zwykłych edytorach tekstu, natomiast format binarny zapewnia dokładniejszy zapis liczb, ponieważ zapisywana jest dokładna wewnętrzna reprezentacja liczby. Do przetwarzania plików w języku C++ stosowane są strumienie.

Strumienie Operacje we/wy realizuje się w C++ za pomocą strumieni. Strumień możemy wyobrażać sobie jako ciąg danych (informacji), w postaci bajtów, płynący od źródła do ujścia. Zachodzą przy tym dwie możliwości: informacja płynie od naszego programu do odbiornika (ujścia). Odbiornikiem może być terminal, plik, gniazdo sieciowe, obszar w pamięci, nazwany potok itd. O takim strumieniu mówimy, że jest strumieniem wyjściowym (ang. output stream), informacja płynie do naszego programu ze źródła. Źródłem może być terminal, plik, itd. O takim strumieniu mówimy, że jest strumieniem wejściowym (ang. input stream). Strumień służy do zapisywania bądź odczytywania informacji - dowolnych danych

Strumienie- uproszczony schemat klas 4 Do reprezentowania strumieni i obsługi operacji na nich zdefiniowane są specjalne klasy wyposażone w pola i metody.

Strumienie- podstawowe klasy Podstawową dla nas klasą jest klasa ios, po niej dziedziczą klasy: istream podstawowa klasa reprezentująca strumienie wejściowe. W niej, między innymi, zdefiniowane jest przeciążenie operatora '>>' i tej właśnie klasy obiektem jest cin, reprezentujący standardowy strumień wejściowy. Bardziej wyspecjalizowane klasy do obsługi strumieni wejściowych to m.in: istringstream źródłem jest obiekt klasy string, czyli napis. Dostępna po dołączeniu za pomocą dyrektywy #include<sstream>. ifstream (z ang. intput file stream) źródłem jest plik. Udostępniana po dołączeniu fstream. ostream podstawowa klasa reprezentująca strumienie wyjściowe. W niej właśnie zdefiniowane jest przeciążenie operatora '<<' i obiekty cout, reprezentujący standardowy strumień wyjściowy oraz cerr i clog, reprezentujące standardowy strumień błędów niebuforowany i buforowany, a także manipulator endl. Bardziej wyspecjalizowane klasy do obsługi strumieni wyjściowych to m.in.: ostringstream ujściem jest obiekt klasy string, czyli napis. Udostępniana po dołączeniu pliku sstream. ofstream (z ang. output file stream) odbiornikem jest plik. Udostępniana po dołączeniu pliku nagłówkowego fstream. 5

Strumienie- podstawowe klasy 6 Klasa iostream dziedziczy zarówno po istream, jak i po ostream, zatem dołączając iostream zapewniamy funkcjonalność obu. Podobnie, dołączając fstream zapewniamy dostęp do klas ifstream i ofstream, a dołączając sstream do istringstream i ostringstream. Podsumowując: jeśli w programie wykonujemy tylko konsolowe operacje we/wy (pisanie na ekran, czytanie z klawiatury), to wystarczy dołączyć plik nagłówkowy iostream; jeśli wykonujemy operacje na plikach, to trzeba włączyć plik nagłówkowy fstream; jeśli wykonujemy operacje we/wy, dla których źródłem lub ujściem są obiekty klasy string, to należy dołączyć sstream. Struktura programu działającego na strumieniach: kojarzy strumień z zewnętrznym źródłem/odbiornikiem, otwiera strumień, dodaje lub pobiera dane ze strumienia, zamyka strumień.

Pliki program zapisujący dane do pliku Struktura programu, który zapisuje dane do pliku: 1) Dyrektywa preprocesora #include <fstream> //zapewnia dostęp do klas ifstream i ofstream 2) deklaracja zmiennej (strumienia) typu ofstream ofstream plikwy; 3) wywołanie funkcji wiążącej strumień z konkretnym plikiem i otwierającej go plikwy.open("wyniki.txt"); Kroki 2) i 3) tj. utworzenie obiektu i skojarzenie go z plikiem możemy też zrealizować za pomocą jednej instrukcji: ofstream plikwy("wyniki.txt"); //2)3) drugi sposób 4) działania na plikach: możemy teraz używać strumienia plikwy w taki sam sposób jak obiektu cout, np. plikwy << "jakieś dane do zapisu" << endl << "kolejne dane"; 5) zamknięcie połączenia z plikiem plikwy.close();//obiekt plikwy istnieje nadal i możemy go użyć //do połączenia z jakimś plikiem 7

Pliki program zapisujący dane do pliku - uwagi Uwaga 1: Otwarcie w ten sposób pliku do zapisu spowoduje utworzenie nowego pliku, jeśli nie ma jeszcze pliku o tej nazwie, a jeśli plik o tej nazwie istnieje jego zawartość zostanie skasowana i operacje wyjścia rozpoczną zapis do pustego pliku. Uwaga 2: Ścieżki do pliku mogą być względne oraz bezwzględne. Ścieżka względna to taka, która nie zawiera pełnej ścieżki do pliku, np. sama nazwa pliku wraz z rozszerzeniem, bądź ścieżka względem katalogu roboczego aplikacji. Ścieżka bezwzględna określa natomiast pełną ścieżkę do pliku i zaczyna się od nazwy dysku, a kończy się na pełnej nazwie pliku np. "D:\\plik.txt" lub "D:/mojkatalog/plik.txt". Uwaga 3. Nazwa pliku w funkcji open jak i w konstruktorze jest C-napisem. Dlatego jeśli jest ona pobierana do zmiennej string musimy przekonwertować ją do C-napisu przy pomocy metody c_str() : string snazwapliku; cout<<"podaj nazwę pliku: "; cin>>snazwapliku; ofstream plik; plik.open( snazwapliku.c_str() ); //C++ 98 od C++11 istnieje druga wersja funkcji open, z parametrem typu string plik.open( snazwapliku ); //C++ 11 8

Pliki program odczytujący dane z pliku 9 Operacje niezbędne do realizacji odczytu z pliku są podobne do operacji zapisu do pliku 1) dołączamy plik nagłówkowy fstream #include <fstream> //zapewnia dostęp do klas ifstream i ofstream 2) deklarujemy zmienną (strumienia) typu ifstream ifstream plikwe; 3) kojarzymy strumień z konkretnym plikiem i otwieramy go plikwe.open("dane.txt"); Kroki 2) i 3) tj. utworzenie obiektu i skojarzenie go z plikiem możemy też zrealizować za pomocą jednej instrukcji: ifstream plikwe("dane.txt"); //2)3) drugi sposób 4) działania na plikach: możemy teraz używać strumienia plikwe w taki sam sposób jak strumienia cin (operator >> pomija białe znaki), np. jeśli wiemy, ze w pliku jest zapisana liczba całkowita int n; plikwe >> n; 5) zamykamy połączenie strumienia z plikiem plikwe.close(); //obiekt plikwe istnieje nadal i możemy go użyć //do połączenia z innym (lub ponownie z tym samym) plikiem

10 Kontrola strumienia i metoda is_open() Stan strumienia sprawdzamy, aby dowiedzieć się czy ostatnia operacja powiodła się, np. czy powiodło się otwarcie pliku (plik nie istnieje, nie posiadamy uprawnień do odczytu/modyfikacji). Po wykonaniu operacji, wewnątrz obiektu ustawiane są odpowiednie flagi (znaczniki), które informują o tym, czy się ona powiodła, czy też nie. Funkcje sprawdzające stan strumienia to m.in.: good() i fail(): ifstream fin; fin.open("nazwapliku.txt"); if(fin.fail()) //proba otwarcia zakończyła się niepowodzeniem //lub if(!fin.good()) //otwarcie nie powiodło się //lub równoważnie krócej możemy użyć konstrukcji: if(!fin) //gdyż obiekt fin podlega konwersji na bool //lub zalecane if(!fin.is_open()) //otwarcie nie powiodło się Zaleca się korzystanie z funkcji is_open(), gdyż wykrywa ona wszystkie błędy wykrywane przez good(), a ponadto wykrywa próby otwarcia pliku z zastosowaniem nieodpowiedniego trybu otwarcia pliku.

11 Przykład 1 W pliku "mapa.txt" (znajdującym się w tym samym katalogu co pisany program) znajdują się następujące dane: skala odl_1 odl_2... odl_n. Skala określa jaka odległość w kilometrach odpowiada jednemu milimetrowi na mapie. Napisz program, który obliczy długość trasy w terenie na podstawie odczytów z mapy w danej skali. Otrzymany wynik zapisze w pliku "trasa.txt". Przed podaniem łącznej długości trasy, w pliku tym zapisze w osobnych liniach numery oraz długości poszczególnych odcinków trasy w km. Dane poprzedzić odpowiednimi nagłówkami. Np. dla pliku "mapa.txt" zawierającego dane: 2 1.6 3.3 3.75 4.2 1.4 plik " trasa.txt" ma wyglądać następująco: Odcinek długość RAZEM: 1 3.2 2 6.6 3 7.5 4 8.4 5 2.8 28.5 km

12 Przykład 1 #include <iostream> #include <iomanip> #include <fstream> using namespace std; int main() { ifstream pwe; //deklaracja strumienia wejściowego pwe.open("mapa.txt"); //kojarzymy z plikiem i otwieramy if(!pwe.is_open()) //jeśli błąd otwarcia pliku { //konczymy program cout<<"blad otwarcia pliku"<<endl; return 1; }

13 Przykład 1 ofstream pwy; //tworzymy strumień wyjściowy pwy.open("trasa.txt"); //kojarzymy z plikiem i otwieramy if(!pwy.is_open()) { //kończymy program cout<<"blad otwarcia pliku wynikowego"<<endl; return 1; } pwy<<"odcinek dlugosc\n"; //wstawiamy tekst nagłówka pwy << fixed << setprecision(1); //ustalamy formatowanie wyników float skala, odlmm, //odległość z mapy w mm odlkm, //odległość przeliczona w kilometrach trasa=0.0f; //łączna długość trasy int nr = 0; //zmienna do numeracji kolejnych odcinków pwe>>skala; //wczytanie skali z pliku wejściowego

Przykład 1 14 } while (pwe>>odlmm) { //mamy kolejny odcinek nr++ ; odlkm = odlmm*skala ; //przeliczamy odleglosc //zapisujemy odcinek do pliku wynikowego pwy << setw(6) << nr << setw(8) << odlkm << endl; //i dodajemy do ogólnej długości trasy trasa = trasa + odlkm; } // odczytaliśmy wszystkie dane z pliku "mapa.txt" // należy dopisać ostatnią linię z podsumowaniem pwy << "RAZEM:" << setw (8 ) << trasa << " km"; pwe.close(); pwy.close(); return 0;

Przykład 2: pliki i funkcje 15 Dany jest plik tekstowy liczbyr.txt zawierający liczby rzeczywiste oddzielone znakami białymi (tabulatory, spacje, znaki końca linii). Napisz dwie wersje funkcji logicznej SumaPliku, które obliczają sumę elementów pliku: dla pierwszej funkcji plik podany jest przez nazwę pliku, a druga funkcja otrzymuje plik jako strumień gotowy do pracy. Wartością funkcji ma być true w przypadku, gdy wszystkie operacje na pliku powiodły się i false w przeciwnym wypadku. Jeśli plik był pusty funkcja zwraca false. Obliczona suma przekazywana ma być przez parametr.

Przykład 2 (funkcja dostaje nazwę pliku) 16 #include<iostream> #include<fstream> #include<string> using namespace std; //funkcja oblicza sumę liczb w pliku bool SumaPlik(string nazwa, double &suma) { ifstream pwe; pwe.open(nazwa.c_str()); //w C++11: pwe.open(nazwa); if(!pwe.is_open()) return false;

Przykład 2 (funkcja dostaje nazwę pliku) 17 suma=0.0; double x; if (!(pwe>>suma)) return false; //plik pusty lub błąd while(pwe>>x) suma+=x; //w naszych programach będziemy zakładać, że pliki mają //poprawną strukturę, ale jeśli by tak nie było //to możemy sprawdzić, czy osiągnęliśmy koniec pliku //czy był błąd, pwe>>x nie powiodło się (plik jest w stanie błędu) } if(!pwe.eof())//jeśli nie doszliśmy do końca pliku return false; pwe.close(); return true;

18 Przykład 2 (funkcja dostaje nazwę pliku) int main() { //funkcja dostaje nazwę pliku string npliku; cout << "podaj nazwe pliku "; cin >> npliku; double sum; } if(sumaplik(npliku,sum)) cout << "suma liczb w pliku = " << sum << endl; else cout << "blad operacji plikowych" << endl; return 0;

Przykład 2 (funkcja dostaje referencję na strumień) 19 //funkcja oblicza sumę liczb w pliku, jako parametr dostaje // strumień gotowy do użycia bool SumaPlik(ifstream &pwe, double &suma) { if(!pwe) return false; suma = 0.0; double x; if (!(pwe>>suma)) return false; //plik pusty lub błąd while(pwe >> x) suma += x; return true; }

Przykład 2 (funkcja dostaje referencję na strumień) 20 int main() { //funkcja dostaje & na strumień string nazwa; cout << "podaj nazwe pliku: "; cin >> nazwa; double s; ifstream pwe(nazwa.c_str()); //ifstream pwe(nazwa); //w C++11 if(sumaplik(pwe,s)) cout<<"suma liczb w pliku = "<<s<<endl; else cout<<"blad operacji plikowych"<<endl; pwe.close(); return 0; }

Przykład 2 wersja z dokładnym określeniem rodzaju błędu 21 enum ResultType{OK, OPEN_ERROR, EMPTY_FILE, READ_ERROR}; //funkcja oblicza sumę liczb w pliku, dokładnie określany jest rodzaj błędu ResultType SumaPlikEnum(string nazwa, double &suma) { ifstream pwe(nazwa.c_str()); //w C++11: ifstream pwe(nazwa); if(!pwe.is_open()) return OPEN_ERROR; suma=0.0; double x; if (!(pwe>>suma)) return pwe.eof()?empty_file:read_error; //plik pusty lub błąd while(pwe>>x) suma += x; if(!pwe.eof()) //jesli nie doszliśmy do końca pliku return READ_ERROR; pwe.close(); return OK; }

22 Przykład 2 wersja z dokładnym określeniem rodzaju błędu int main() { //funkcja z wykorzystaniem enum string nplik; cout << "podaj nazwe pliku: "; cin >> nplik; double suma; switch(sumaplikenum(nplik,suma)) { case OK: cout<<"suma elementow= "<<suma<<endl; break; case OPEN_ERROR: cout<<"blad otwarcia pliku "<<endl; break; case EMPTY_FILE: cout<<"plik pusty"<<endl; case READ_ERROR: cout<<"blad odczytu z pliku"<<endl; } return 0; }