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.

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

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

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

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

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

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

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

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

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

Programowanie i struktury danych

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

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

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

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

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

Wprowadzenie do programowania i programowanie obiektowe

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

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

Język C++ wykład VIII

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

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

Pytania sprawdzające wiedzę z programowania C++

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

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

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

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

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

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

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

Programowanie - wykład 4

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

Programowanie komputerowe. Zajęcia 1

Wstęp do informatyki- wykład 7

Programowanie Obiektowe i C++

Wejście wyjście strumieniowe

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

Część 4 życie programu

1 Powtórzenie wiadomości

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

1 Podstawy c++ w pigułce.

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

C++ wprowadzanie zmiennych

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

4. Funkcje. Przykłady

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

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

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

Wstęp do informatyki- wykład 6

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

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

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

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

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

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

Inicjacja tablicy jednowymiarowej

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

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

INFORMATYKA Studia Niestacjonarne Elektrotechnika

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

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

Struktura pliku projektu Console Application

C-struktury wykład. Dorota Pylak

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

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

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

Operatory na rzecz typu TString

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

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

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

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

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

Wstęp do programowania

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

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

Zasady programowania Dokumentacja

Egzamin z Podstaw informatyki i programowania 2007/2008

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

Metody Metody, parametry, zwracanie wartości

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

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

1 Wielokrotne powtarzanie tych samych operacji

Podstawy programowania w C++

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

Funkcje zawarte w bibliotece < io.h >

Wstęp do programowania. Wykład 1

Rzutowanie i konwersje

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Programowanie obiektowe

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

Programowanie w językach wysokiego poziomu

Język ludzki kod maszynowy

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 pwe>>suma; if (!pwe)//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;

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;