C++ mgr inż. Tomasz Turba Politechnika Opolska 2016
Zajęcia [ ] Debuggowanie (Dev-C++?) Operacje na plikach Zadanie domowe
Debuggowanie Dwuklik -> breakpoint Add watch -> zmienna Kompilator –g (Tools > Compiler Options) F5
Operacje na plikach 1. Dyrektywa file stream -> #include 2. Uchwyt (obiekt) do przechowania obsługi pliku -> std::ifstream plik; 3. Otwarcie pliku – ścieżka -> plik.open( "C:\\odczyt.txt" ); 4. Ścieżka względna -> („odczyt.txt”); 5. Ścieżka bezwzględna -> „C:\\odczyt.txt”); 6. Backslash w pełnej ścieżce! 7. Weryfikacja otwarcia 8. Przekazanie i modyfikacja zawartości 9. Zapis 10. Zamknięcie 11. Weryfikacja zamknięcia
#include bool wyswietl(std::string nazwapliku) { std::ifstream plik; plik.open(nazwapliku.c_str()); if(!plik.good()) return false; std::string wiersz; while(std::getline(plik, wiersz)) { std::cout << wiersz << std::endl; } plik.close(); return true; } int main() { if( !wyswietl( "pliczek.txt")) std::cout << "Plik nie istnieje lub problem z otwarciem" << std::endl; return 0; }
Operator „>>” – spróbuj zrobić taki program Dane można wczytywać operatorem >>, biały znak zawsze jest pomijany (wskazówka: isspace) Stwórz plik: 1 dodac 2 2 dodac 3 Podpowiedzi: int a, c; string b; Podpowiedź: plik >> a >> b >> c; funkcja(int l1, string z, intl2) {if z=„dodac” dodaj(l1, l2)}
Operator „>>” – spróbuj zrobić taki program Dane można wczytywać operatorem >>, biały znak zawsze jest pomijany (wskazówka: isspace) Stwórz plik: 1 dodac 2 2 dodac 3 Podpowiedzi: int a, c; string b; Podpowiedź: plik >> a >> b >> c; funkcja(int l1, string z, intl2) {if z=„dodac” dodaj(l1, l2)}
IOS – tryby odczytu void open(const char * nazwa_pliku, ios_base::openmode tryb_otwarcia_pliku); ios::app (append - dopisywanie danych do pliku) Ustawia wewnętrzny wskaźnik zapisu pliku na jego koniec. Plik otwarty w trybie tylko do zapisu. Dane mogą być zapisywane tylko i wyłącznie na końcu pliku. ios::ate (at end) Ustawia wewnętrzny wskaźnik pliku na jego koniec w chwili otwarcia pliku. ios::binary (binary) Informacja dla kompilatora, aby dane były traktowane jako strumień danych binarnych, a nie jako strumień danych tekstowych. ios::in (input - wejście/odczyt) Zezwolenie na odczytywanie danych z pliku. ios::out (output - wyjście/zapis) Zezwolenie na zapisywanie danych do pliku. ios::trunc (truncate) Zawartość pliku jest tracona, plik jest obcinany do 0 bajtów podczas otwierania.
IOS cd Otwarcie do zapisu i odczytu: std::fstream plik; plik.open( "nazwa_pliku.txt", std::ios::in | std::ios::out );
Zapis std::fstream plik("nazwa_pliku.txt", std::ios::out); std::string napis; getline(std::cin, napis); plik.write( & napis[0], napis.length() );
Zapis #include using namespace std; int main() { string const nazwaPliku("C:/pliczek.txt"); ofstream mojStrumien(nazwaPliku.c_str()); if(mojStrumien) { mojStrumien << "Przykladowe zdanie zapisane do pliku." << endl; mojStrumien << << endl; int age(30); mojStrumien << "Mam " << age << " lat." << endl; } else { cout << „Error!” << endl; } return 0; }
Sposoby odczytu Linijka po linijce: string linia; getline(strumien, linia); Zmiennymi: double liczba; strumien >> liczba string slowo; strumien >> slowo; Char by char: char a; strumien.get(a);
Poruszanie się po pliku Seekg(); Seekp(); strumien.seekp(liczbaZnakow, pozycja); strumien.seekp(10, ios::beg); //przesun 10 znaków od początku pliku i ustaw tu kursor Tellg(); Tellp(); ofstream plik("C:/sciezka/pliczek.dat"); int pozycja = plik.tellp(); cout << „Jestes na znaku nr " << position << " w pliku." << endl; Pozycja = ios::beg — początek pliku ios::end — koniec pliku ios::cur — bieżąca pozycja
Zadanie domowe 1. Napisz program sprawdzający długość w bajtach podanego z palca pliku [1 pkt] Wprowadź nazwę pliku: plik1.txt Długość plik1.txt wynosi: 133 Podpowiedź: seekg, tellg 2. Przerób zadanie domowe ze strukturami na operacje na plikach [4pkt] Pierwsze uruchomienie: dodanie pracowników z parametrami do pliku Drugie uruchomienie: jeżeli plik istnieje – wyświetl dane i w menu zaproponuj dopisanie kolejnego pracownika Sortowanie przez wiek, stawkę, wynagrodzenie nadal obowiązuje Wykorzystaj append, seek, tellp, może tablica…?