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

Podobne dokumenty
Pliki wykład 2. Dorota Pylak

Pliki wykład 2. Dorota Pylak

Pliki wykład. Dorota Pylak

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

Pliki wykład. Dorota Pylak

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

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

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

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

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

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

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

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

Programowanie w językach

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

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

Programowanie i struktury danych

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

INFORMATYKA Studia Niestacjonarne Elektrotechnika

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

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

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

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

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

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

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

1 Podstawy c++ w pigułce.

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

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

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

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

Język C++ wykład VIII

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

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

Część 4 życie programu

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

Pytania sprawdzające wiedzę z programowania C++

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

Wstęp do informatyki- wykład 4 Deklaracja zmiennych Typy

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

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

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

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

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

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

4. Funkcje. Przykłady

Programowanie Obiektowe i C++

Podstawy Programowania

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

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

Wejście wyjście strumieniowe

Wprowadzenie do programowania i programowanie obiektowe

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Wstęp do programowania

Podstawy programowania w C++

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

Algorytmika i programowanie. dr inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Zasady programowania Dokumentacja

Programowanie komputerowe. Zajęcia 1

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

1 Podstawy c++ w pigułce.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

1. Wprowadzanie danych z klawiatury funkcja scanf

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

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

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

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

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

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

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

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

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

Podstawy programowania w języku C++

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

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

Wstęp do programowania. Wykład 1

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

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

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

Programowanie - wykład 4

Wstęp do programowania

Wstęp do programowania

C++ wprowadzanie zmiennych

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

I - Microsoft Visual Studio C++

Wstęp do informatyki- wykład 6

Język ludzki kod maszynowy

dr inż. Jarosław Forenc

Wstęp do informatyki- wykład 11 Funkcje

Struktura pliku projektu Console Application

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

Wstęp do informatyki- wykład 9 Funkcje

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

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

MATERIAŁY DO ZAJĘĆ II

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

I znowu można jak w C, za pomocą starych struktur i metod:

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Wstęp do informatyki- wykład 5 Instrukcja selekcji if-else Operatory arytmetyczne i logiczne

Transkrypt:

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

Struktura programu działającego na plikach 2 1) Dyrektywa preprocesora #include <fstream> //zapewnia dostęp do klas ifstream i ofstream 2) deklaracja zmiennej (strumienia) typu ofstream (zapis do pliku) ofstream plik; //lub ifstream (czytanie z pliku) ifstream plik; 3) wywołanie funkcji wiążącej strumień z konkretnym plikiem i otwierającej go plik.open("nazwa_pliku.txt"); Kroki 2) i 3) tj. utworzenie obiektu i skojarzenie go z plikiem możemy też zrealizować za pomocą jednej instrukcji: //lub ofstream plik("nazwa_pliku.txt"); //2)3) drugi sposób ifstream plik("nazwa_pliku.txt"); 4) sprawdzenie czy otwarcie się powiodło np. if(!plik.is_open()) //otwarcie nie powiodło się cout<<"blad otwarcia pliku"; return 1;

Struktura programu działającego na plikach 5) działania na plikach: możemy teraz używać strumienia plik w taki sam sposób jak obiektu cout w przypadku pliku do zapisu plik << "jakieś dane do zapisu" << endl << "kolejne dane"; lub jak obiektu cin w przypadku pliku do odczytu np. dla pliku zawierającego liczby całkowite oddzielone znakami białymi int x; while (plik>>x) //jakieś operacje na x 6) zamknięcie połączenia z plikiem plik.close();//obiekt plik istnieje nadal i możemy go użyć //do połączenia z jakimś plikiem Uwaga. 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 3

Przykład 2: pliki i funkcje 4 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) 5 #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; suma=0.0; //zmienna na sumę double x; //zmienna do której będziemy pobierać kolejne liczby z pliku

6 Przykład 2 (funkcja dostaje nazwę pliku) //próbujemy pobrać pierwszy element, aby sprawdzić czy plik pusty if (!(pwe>>suma))//jeśli pobranie 1-ej liczby nie powiodło się pwe.close(); return false; //plik pusty lub błąd while(pwe>>x) //pobieramy kolejne elementy z pliku 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 pwe.close(); return false; pwe.close(); return true;

7 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;

8 Przykład 2 (funkcja dostaje referencję na strumień) //funkcja oblicza sumę liczb w pliku, jako parametr dostaje // strumień gotowy do użycia bool SumaPlik(ifstream &pwe, double &suma) if(!pwe) //sprawdzamy stan strumienia, jeśli jest w stanie błędu return false; suma = 0.0; //zerujemy sumę double x; //zmienna do której będziemy pobierać elementy z pliku if (!(pwe>>suma)) //jeśli czytanie pierwszego elementu się nie udało return false; //plik pusty lub błąd while(pwe >> x) //pobieramy kolejne elementy suma += x; //jeśli wczytaliśmy element zwiększamy sumę return true;

Przykład 2 (funkcja dostaje referencję na strumień) 9 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;

10 Przykład 2 wersja z dokładnym określeniem rodzaju błędu enum ResultTypeOK, 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)) pwe.close(); 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 pwe.close(); return READ_ERROR; pwe.close(); return OK;

11 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;

Operatory << i >> Operator '<<' lub '>>' jest funkcją, która prócz wykonania samej operacji we/wy, zwraca jako rezultat referencję do tego samego obiektu-strumienia, który był jej pierwszym (lewym) argumentem. Domyślnie zmienne typów wbudowanych wyprowadzane są następująco: Strumienie wyjściowe: wartości całkowite (jak int, short, itd.): w systemie dziesiętnym; wartości znakowe: jako pojedyncze znaki; wartości zmiennopozycyjne (czyli float, double i long double): w systemie dziesiętnym, z precyzją 6 cyfr. Precyzja oznacza liczbę cyfr znaczących, a nie liczbę cyfr po kropce dziesiętnej. Końcowe zera po kropce dziesiętnej nie są pisane. Tak więc wartość 1.129996 zostanie najpierw zaokrąglona do sześciu cyfr znaczących, dając 1.13000, a następnie wypisana jako 1.13 (ale na przykład wydruk 1.129994 da 1.12999). Jeśli po kropce wystąpiłyby same zera, to opuszczane są i zera, i sama kropka dziesiętna. Jeśli liczba cyfr przed kropką wynosi lub przekracza sześć, to wypisane zostaną wszystkie, a część ułamkowa zostanie pominięta; wartości logiczne (typu bool): jako liczby 1 i 0. Białymi znakami są nazywane te symbole, które są używane w tekście i nie posiadają swojej reprezentacji graficznej, np. spacja, tabulacja, znak przejścia do nowej linii. Funkcja int isspace( int ch ) zwraca wartość różną od zera, gdy argument ch jest białym znakiem, zero w przeciwnym przypadku. 12

Operatory << i >> 13 Strumienie wejściowe: wiodące białe znaki (spacje, tabulacje, znak nowej linii) są pomijane; każda następna niepusta sekwencja białych znaków jest interpretowana jako koniec danych. Znaki te pozostają w buforze i będą pominięte, jako wiodące, przy następnym czytaniu; liczby całkowite wczytywane są w postaci dziesiętnej; pierwszym niebiałym znakiem może być znak '+' lub '-', następnie wczytywane są cyfry aż do napotkania znaku nie będącego cyfrą ten znak jest pozostawiany w buforze i będzie pierwszym znakiem wczytanym przez następną operację czytania. Na przykład, jeśli program czyta za pomocą instrukcji 'cin >> x >> y', to można podać jako dane 128-25; wczytywanie 128 do x zakończy się na znaku minus, który pozostanie w strumieniu. Następnie będzie kontynuowane czytanie do y znaków -25; liczby zmiennopozycyjne wczytywane są w formacie liczb całkowitych bez kropki dziesiętnej, w formacie z kropką dziesiętną i w notacji naukowej (na przykład 1e-1 to to samo co 0.1, 1.201e+2 to 120.1); wartości logiczne mają postać literałów 1 i 0. Operator >> zawsze pomija wszelkie napotkane białe znaki

Odczyt/zapis nieformatowany 14 Do tej pory mówiliśmy o zapisie/odczycie formatowanym informacja czytana lub pisana jest w jakiś sposób interpretowana: opuszczane są białe znaki, dokonuje się przekształceń liczb do napisów w różnych formatach itd. Istnieją też operacje we/wy nieformatowane, które czytają lub piszą surowe bajty bez ich żadnej interpretacji. Wczytanie danych ze strumienia bez ich interpretacji i formatowania: istream& get(char& c) czyta jeden bajt; zwraca referencję do strumienia, na rzecz którego została wywołana, więc może być używana kaskadowo. Argument typu char jest przesyłany przez referencję; po powrocie jego wartością będzie wczytany znak. Może to być dowolny znak, również znak kontrolny, biały lub zerowy '\0'. Jeśli czytanie nie powiodło się, bo napotkany został koniec pliku, znak c będzie równy EOF, czyli znak, który w danym systemie operacyjnym oznacza koniec danych (Ctrl-Z w Windows, Ctrl-D pod Uniksem/Linuksem). Sam strumień będzie wtedy w stanie błędu. Funkcji tej możemy używać dla strumieni wejściowych: plikowych (ifstream), a także dla strumienia cin, gdy chcemy czytać jeden bajt bez pomijania znaków białych.

Odczyt nieformatowany jednoznakowe funkcje wejścia 15 Np., jeśli fin jest strumieniem wejściowym związanym z plikiem, to można zawartość tego pliku przekopiować na standardowe wyjście prostą pętlą ifstream fin("dane.txt"); char c; while (fin.get(c)) cout << c; Funkcję get możemy wywoływać kaskadowo, np. char a, b, c; fin.get(a).get(b).get(c); przy czym w ten sposób możemy wczytać dowolne znaki; bez żadnego opuszczania białych znaków, interpretacji znaku końca linii itp. int get() zwraca wczytany znak w formie liczby typu int; w razie napotkania końca pliku zwrócone zostanie EOF. Ta forma funkcji get nie zwraca referencji do strumienia, więc nie może być używana kaskadowo. int ch; while((ch=cin.get())!= EOF) //przetwarzanie danych

Przykład 3 funkcja get(char &) Napisz funkcję, która dla pliku o nazwie podanej przez pierwszy parametr funkcji oblicza prawdopodobieństwo z jakim znak podany przez drugi parametr występuje w pliku (tj. liczbę wystąpień znaku / liczbę wszystkich znaków). Jeśli operacje plikowe nie powiodą się lub plik jest pusty, wartością funkcji ma być 1. float prawdopznaku(string n, char szuk) ifstream we; we.open(n.c_str()); //c++98 lub we.open(n); //c++11 if(!we.is_open()) return -1; char zn; int ilew=0, ileszuk=0; while(we.get(zn)) ilew++; if(zn == szuk) ileszuk++; we.close(); if(ilew) return ileszuk*1.0f/ilew; else //plik pusty return -1; 16

17 Przykład 3 int main() float p = prawdopznaku("t.txt",'\n'); if(p<0) cout<<"blad operacji plikowych"<<endl; else cout<<"prawdopodobienstwo = "<< p <<endl; return 0; Jednoznakowa funkcja do zapisu: ostream& put(char c) wstawia znak (bajt) c do strumienia. Zwraca referencję do strumienia, na rzecz którego metoda została wywołana. PRZYKŁAD 4. Napisz funkcję o nagłówku: bool kopiasp_(string nwe, string nwy); która tworzy kopię pliku o nazwie nwe do pliku o nazwie nwy, przy czym zamienia znaki spacji na znaki podkreślenia '_'. Funkcja zwraca true jeśli operacje plikowe się powiodły, w przeciwnym razie false. Dla pliku pustego tworzy plik pusty.

Przykład 4 18 bool kopiasp_(string nwe, string nwy) ifstream we(nwe.c_str()); if(!we.is_open()) return false; ofstream wy(nwy.c_str()); if(!wy.is_open()) we.close(); return false; char zn; while(we.get(zn)) if(zn == ' ') wy.put('_'); // lub wy<<'_'; else wy.put(zn); // lub wy<<zn; we.close(); wy.close(); return true;

19 Przykład 4 int main() string nwe,nwy; cout<<"podaj nazwa pliku we "; cin>>nwe; cout<<"podaj nazwa pliky wy "; cin>>nwy; if(kopiasp_(nwe, nwy)) cout<<"ok"<<endl; else cout<<"blad otwarcia pliku"<<endl; return 0;

21 getline(string) Wprowadzanie danych do obiektów string: string s; cin >> s; //wczytuje słowo getline(cin, s); //wczytuje linię, pomija \n Mamy dwie wersje funkcji getline(): istream& getline (istream& is, string& str); istream& getline (istream& is, string& str, char delim); druga pozwala na określenie znaku kończącego wczytywanie. Powyższe wersje funkcji dla klasy string automatycznie dopasowują rozmiar obiektu string do liczby zapisywanych znaków string lname; cin>>lname; //potrafi wczytać bardzo długie słowo getline(cin, lname); //wczytuje linię, obcina '\n'

getline(string) 22 Istnieją pewne ograniczenia na długość wprowadzanego ciągu do obiektu string: 1) maksymalny dopuszczalny rozmiar przechowywany w stałej string::npos (zazwyczaj jest to maksymalna wartość typu unsigned int) 2) ilość pamięci dostępnej w programie Funkcja getline() klasy string wczytuje wprowadzane znaki i zapisuj je w obiekcie klasy string, dopóki nie zajdzie jedna z trzech okoliczności: a) program natrafi na koniec pliku b) program natrafi na znak kończący wczytywanie, domyślnie jest to \n. Znak ten jest pobierany ze strumienia, ale nie jest zapisywany do obiektu string c) zostanie wczytana maksymalna liczba znaków, czyli mniejsza z wartości: string::npos oraz liczby bajtów pamięci dostępnych na zapisanie ciągu. Funkcja operator>>() w klasie string czyta słowo, czyli omija wiodące znaki białe, a potem dochodzi do znaku białego i zostawia go w kolejce wejścia. Powyższych funkcji klasy string możemy używać do wczytywania plików.

23 Przykład 5 - getline(string) Napisz funkcję, która policzy liczbę wszystkich linii oraz liczbę pustych linii w pliku tekstowym, którego nazwa jest parametrem funkcji. Wynikiem funkcji jest liczba linii lub -1, jeśli otwarcie pliku nie powiodło się. Liczbę pustych linii przekazujemy dodatkowym parametrem. Jeśli linia zawiera jakieś znaki białe, to nie jest pustą linią. #include <iostream> #include <fstream> #include <string> using namespace std; int ilelinii(string nplik, int &ilpuste) ifstream pwe(nplik.c_str()); if(!pwe.is_open()) return -1; //plik istnieje i jest otwarty string linia; int ile=0; //liczba wszystkich linii w pliku ilpuste=0; //liczba pustych linii - zerujemy parametr

Przykład 5 - getline(string) 24 while(getline(pwe,linia)) //wczytano linie ile++; //sprawdzamy czy pusta if (linia.empty()) //lub if(linia.size()==0) ilpuste++; pwe.close(); return ile; int main() string nazwaplik; cout << "Podaj nazwe pliku: "; cin>>nazwaplik; int ilp; int ill= ilelinii(nazwaplik, ilp); if(ill<0) cout<<"blad otwarcia pliku"<<endl; else cout<<"w pliku "<<nazwaplik<<" mamy "<<ill<<" wszystkich linii " <<endl<<"w tym pustych: "<<ilp<<endl; return 0;