Pliki wykład 2. Dorota Pylak

Podobne dokumenty
Pliki wykład 2. Dorota Pylak

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

Pliki wykład. Dorota Pylak

Pliki wykład. Dorota Pylak

Programowanie w językach

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

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 C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

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

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

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

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

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

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

Programowanie i struktury danych

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

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

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

Wprowadzenie do programowania i programowanie obiektowe

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

Język C++ wykład VIII

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

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

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

Programowanie Obiektowe i C++

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

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

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

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

Pytania sprawdzające wiedzę z programowania C++

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

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

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

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

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

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

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

Wejście wyjście strumieniowe

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

Część 4 życie programu

Programowanie komputerowe. Zajęcia 1

4. Funkcje. Przykłady

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

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

Wstęp do informatyki- wykład 7

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

Programowanie - wykład 4

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

Wstęp do informatyki- wykład 6

1 Podstawy c++ w pigułce.

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

C++ wprowadzanie zmiennych

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

1 Powtórzenie wiadomości

Wstęp do programowania. Dariusz Wardecki, wyk. X

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

Operatory na rzecz typu TString

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

Podstawy Programowania

Inicjacja tablicy jednowymiarowej

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

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

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

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

Zasady programowania Dokumentacja

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 języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

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

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

Wykład :37 PP2_W9

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

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

Wstęp do informatyki- wykład 11 Funkcje

C-struktury wykład. Dorota Pylak

Wstęp do programowania obiektowego

Programowanie w językach wysokiego poziomu

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

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

Wstęp do informatyki- wykład 9 Funkcje

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Podstawy algorytmiki i programowania - wykład 5 C-struktury cd.

Struktura pliku projektu Console Application

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

INFORMATYKA Studia Niestacjonarne Elektrotechnika

do instrukcja while (wyrażenie);

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

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

Wstęp do programowania. Wykład 1

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

Metody Metody, parametry, zwracanie wartości

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

Programowanie obiektowe

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

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

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

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Transkrypt:

Pliki wykład 2 Dorota Pylak

Struktura programu działającego na plikach 1) Dyrektywa preprocesora #include <fstream> //zapewnia dostęp do strumieni ifstream i ofstream 2) deklaracja zmiennej (strumienia) typu wyjściowego ofstream (w przypadku zapisu do pliku) ofstream plik; lub wejściowego ifstream (gdy chcemy czytać z pliku) ifstream plik; 3) wywołanie funkcji wiążącej strumień z konkretnym plikiem i otwierającej go plik.open("nazwa_pliku.txt"); Uwaga 1: 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"); 2

Struktura programu działającego na plikach 3 Uwaga 2: 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 4) sprawdzenie czy otwarcie się powiodło np. if(!plik.is_open()) //jeśli otwarcie nie powiodło się cout<<"blad otwarcia pliku"; return 1; //kończymy program

Struktura programu działającego na plikach 4 5) działania na plikach: możemy teraz w przypadku pliku do zapisu używać strumienia wyjściowego ofstream plik w taki sam sposób jak obiektu cout (wstawiamy nazwę zmiennej strumieniowej typu ofstream w miejsce cout) np. plik << "jakieś dane do zapisu" << endl << "kolejne dane"; int n = 5; plik << n; //możemy korzystać z manipulatorów //pamiętajmy aby dołączyć dyrektywę: //#include<iomanip> double s = 10.578; plik <<fixed << setprecision(2) << x << endl;

Struktura programu działającego na plikach lub w przypadku pliku do odczytu używać strumienia wejściowego ifstream plik jak obiektu cin np. dla pliku zawierającego liczby całkowite oddzielone znakami białymi (spacje, tabulacje, znak nowej linii) int x; while (plik>>x)//dopóki czytanie z pliku się powodzi //tj. nie napotkano końca pliku lub błędnych danych //jakieś operacje na x Uwaga 1. Operator >> zawsze pomija wszelkie napotkane białe znaki Uwaga 2. Operator '<<' lub '>>' jest funkcją, która prócz wykonania samej operacji we/wy, zwraca jeśli operacja się powiodła referencję do tego samego obiektustrumienia, który był jej pierwszym (lewym) argumentem 5

Struktura programu działającego na plikach 6 drugi sposób organizacji pętli pobierającej dane z pliku (sprawdzamy stan strumienia) int x; plik>>x; //odczyt pierwszej danej z pliku przed pętlą //jeśli napotkano znak końca pliku lub błędne dane //plik wchodzi w stan błędu (awarii) while (plik)//dopóki czytanie z pliku się powodzi //jakieś operacje na x plik>>x; //odczyt kolejnej danej z pliku

Struktura programu działającego na plikach Uwaga 1. Ponieważ obiekt plik podlega konwersji na bool, to stan strumienia tj. czy ostatnio wykonywana operacja np. otwieranie pliku czytanie (pobieranie danych) z pliku powiodła się czy też nie: próba otwarcia nieistniejącego pliku napotkano koniec pliku lub błędne dane i plik jest w stanie błędu, możemy sprawdzić poprzez if(plik) //jeśli jest ok lub if(!plik) //jeśli plik jest w stanie błędu-awarii Przy czym do sprawdzania czy otwarcie pliku nie powiodło się zaleca się korzystanie z funkcji is_open(), gdyż dodatkowo wykrywa próby otwarcia pliku z zastosowaniem nieodpowiedniego trybu otwarcia pliku. if(!plik.is_open()) //jeśli otwarcie pliku nie powiodło się 7

Struktura programu działającego na plikach 8 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

Przykład 2: pliki i funkcje 9 Dany jest plik tekstowy liczbyr.txt zawierający liczby rzeczywiste oddzielone znakami białymi (tabulatory, spacje, znaki końca linii). Napisz funkcję logiczną SumaPliku, która oblicza sumę elementów pliku, którego nazwa jest parametrem funkcji. 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 (funkcja dostaje nazwę pliku) 10 #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())//błąd otwarcia pliku return false; suma=0.0; //zmienna na sumę, zerujemy double x; //zmienna do której będziemy pobierać kolejne liczby z pliku

11 Przykład (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 danych while(pwe>>x) //pobieramy kolejne elementy z pliku suma+=x; //dodajemy je kolejno do sumy //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;

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

Odczyt/zapis nieformatowany 13 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. 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, nie omija znaków białych 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 14 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ą int main() ifstream fin("dane.txt"); if(!fin.is_open()) //jeśli otwarcie nie powiodło się cout<<"blad otwarcia pliku"; return 1; //kończymy program char c; fin.get(c); while (fin) LUB while (fin.get(c)) cout << c; fin.get(c); fin.close(); return 0; cout<<c;

Odczyt nieformatowany jednoznakowe funkcje wejścia 15 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. FUNKCJA get DRUGA WERSJA: 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 2 funkcja get(char &) Napisz program, który oblicza liczbę małych liter, dużych liter, cyfr, spacji i pozostałych znaków znajdujących się w pliku o nazwie podanej przez użytkownika. Jeśli operacje plikowe nie powiodą się program powinien wyświetlić odpowiedni komunikat. #include<iostream> #include<fstream> #include<string> using namespace std; int main() ifstream f; string nazwa; cout<<"podaj nazwę pliku do analizy "; cin>>nazwa; f.open(nazwa.c_str()); //w C++11: f.open(nazwa); if(!f.is_open()) cout<<"blad otwarcia pliku"; return 1; char znak; //liczniki znaków: malych liter, duzych liter, cyfr, spacji, innych int male=0,duze=0,cyfry=0,spacje=0,inne=0; 16

Przykład 2 funkcja get(char &) f.get(znak);//pobieramy znak while(f) //dopóki czytanie się udało if(znak>='a' && znak<='z') male++; else if(znak>='a' && znak<='z') duze++; else if(znak>='0' && znak<='9') cyfry++; else if(znak == ' ') spacje++; else inne++; f.get(znak);//proba pobrania kolejnego znaku f.close(); cout<<"malych liter: " << male << endl; cout<<"duzych liter: " << duze << endl; cout<<"cyfr: " << cyfry << endl; cout<<"spacji: "<< spacje << endl; cout<<"pozostalych znakow: " << inne << endl; return 0; 17

Przykład 2 funkcja get(char &) Napisz funkcję logiczną, który oblicza liczbę małych liter, dużych liter, cyfr, spacji i pozostałych znaków znajdujących się w pliku tekstowym o nazwie podanej jako argument funkcji. Jeśli plik nie został poprawnie otwarty wartością funkcji ma być false, true w przeciwnym przypadku. 1 sposób) bool analiza(string nazwa, int & male, int & duze, int & cyfry, int & spacje, int & inne); 2 sposób) Stwórzmy pomocniczą strukturę: struct Statystyka int male, duze, cyfry, spacje, inne; ; bool analiza2(string nazwa, Statystyka & s) ifstream f; f.open(nazwa.c_str()); //w C++11: f.open(nazwa); if(!f.is_open()) return false; 18

Przykład 2 funkcja get(char &) //zerujemy pola struktury-liczniki znaków: małych liter, // dużych, cyfr,spacji, innych s.male=0; s.duze=0; s.cyfry=0; s.spacje=0; s.inne=0; char znak; while(f.get(znak)) //dopóki czytanie się udało f.close(); if(znak>='a' && znak<='z') s.male++; else if(znak>='a' && znak<='z') s.duze++; else if(znak>='0' && znak<='9') s.cyfry++; else if(znak == ' ') s.spacje++; else s.inne++; return true; 19

Przykład 2 20 int main() Statystyka stat; if ( analiza2("dane.txt", stat) ) cout<<"malych liter: " << stat.male << endl; cout<<"duzych liter: " << stat.duze << endl; cout<<"cyfr: " << stat.cyfry << endl; cout<<"spacji: "<< stat.spacje << endl; cout<<"pozostalych znakow: " << stat.inne << endl; else cout<<"blad operacji plikowych"<<endl; return 0;

put 21 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 3 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; 22

23 Przykład 3 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- kopia"<<endl; else cout<<"blad otwarcia pliku"<<endl; return 0;