Rok akademicki 2014/2015, Wykład nr 1 2/66 Dane podstawowe Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia stacjonarne I stopnia Rok akademicki 2014/2015 Wykład nr 1 (09.10.2014) Politechnika Białostocka, Wydział Elektryczny, Katedra Elektrotechniki Teoretycznej i Metrologii ul. Wiejska 45D, 15-351 Białystok WE-204 e-mail: j.forenc@pb.edu.pl tel. (0-85) 746-93-97 http://we.pb.edu.pl/~jforenc Dydaktyka - slajdy prezentowane na wykładzie konsultacje: poniedziałek, godz. 08:30-10:00, WE-204 piątek, godz. 13:00-14:30, WE-204 sobota, godz. 15:05-16:35, WE-204 (zaoczne) Rok akademicki 2014/2015, Wykład nr 1 3/66 Rok akademicki 2014/2015, Wykład nr 1 4/66 Przedmioty Informatyka 1 i Informatyka 2 Informatyka 1 semestr II wykład: 15 godz. (J. Forenc) pracownia specjalistyczna: 30 godz. (A. Choroszucho, J. Forenc) ECTS: 4 pkt. kod przedmiotu: ES1C200 009 Informatyka 2 semestr III wykład: 15 godz. (J. Forenc) pracownia specjalistyczna: 30 godz. (J. Forenc) ECTS: 3 pkt. kod przedmiotu: ES1C300 016 Program wykładu (1/2) 1. Operacje wejścia-wyjścia w języku C: znakowe, łańcuchowe, sformatowane, rekordowe. Strumienie. Pliki tekstowe i binarne. 2. Wskaźniki, operacje na wskaźnikach. Dynamiczny przydział pamięci w języku C. 3. Programowanie obiektowe w języku C++: operacje wejściawyjścia, klasy i obiekty, dane i funkcje składowe, prawa dostępu do składników klasy, definiowanie funkcji składowych klasy, konstruktory i destruktory. 4. Programowanie obiektowe w języku C++: funkcje zaprzyjaźnione, przeładowanie operatorów, dziedziczenie, funkcje wirtualne. 5. Sprawdzian nr 1.
Rok akademicki 2014/2015, Wykład nr 1 5/66 Rok akademicki 2014/2015, Wykład nr 1 6/66 Program wykładu (2/2) 6. System operacyjny. Funkcje i zadania systemu operacyjnego. Zarządzanie procesami, pamięcią i dyskami. 7. Sieci komputerowe. Technologie, protokoły, urządzenia. Zasada działania sieci Internet. 8. Sprawdzian nr 2. Literatura (1/2) 1. S. Prata: Język C. Szkoła programowania. Wydanie V. Helion, Gliwice, 2006. 2. B.W. Kernighan, D.M. Ritchie: Język ANSI C. Programowanie. Wydanie II. Helion, Gliwice, 2010. 3. R. Reese: Wskaźniki w języku C. Przewodnik. Helion, Gliwice, 2014. 4. J. Grębosz: Symfonia C++ standard: programowanie w języku C++ orientowane obiektowo. Tom 1 i 2. Wydawnictwo Edition 2000, Kraków, 2008. 5. B. Stroustrup: Programowanie. Teoria i praktyka z wykorzystaniem C++. Wydanie II poprawione. Helion, Gliwice, 2013. 6. B. Eckel: Thinking in C++. Edycja polska. Helion, Gliwice, 2002. Rok akademicki 2014/2015, Wykład nr 1 7/66 Rok akademicki 2014/2015, Wykład nr 1 8/66 Literatura (2/2) 7. A.S. Tanenbaum: Systemy operacyjne. Wydanie III. Helion, Gliwice, 2010. 8. W. Stallings: Systemy operacyjne. Struktura i zasady budowy. Mikom, Warszawa, 2006. 9. A.S. Tanenbaum, D.J. Wetherall: Sieci komputerowe. Wydanie V. Helion, Gliwice, 2012. 10. K. Krysiak: Sieci komputerowe. Kompendium. Wydanie II. Helion, Gliwice, 2005. Zaliczenie wykładu - efekty kształcenia (EK1) Student, który zaliczył przedmiot: opisuje podstawowe zadania systemu operacyjnego oraz strukturę sieci komputerowych Student, który zalicza na ocenę dostateczny (3): podaje definicję i wymienia podstawowe zadania systemu operacyjnego opisuje wybraną metodę szeregowania żądań dostępu do dysku oraz wybraną metodę przydziału pamięci dyskowej wyjaśnia podstawowe pojęcia związane z sieciami komputerowymi charakteryzuje wybrane media transmisyjne i urządzenia sieciowe
Rok akademicki 2014/2015, Wykład nr 1 9/66 Rok akademicki 2014/2015, Wykład nr 1 10/66 Zaliczenie wykładu - efekty kształcenia (EK1) Zaliczenie wykładu - efekty kształcenia (EK1) Student, który zaliczył przedmiot: Student, który zaliczył przedmiot: opisuje podstawowe zadania systemu operacyjnego oraz strukturę sieci komputerowych opisuje podstawowe zadania systemu operacyjnego oraz strukturę sieci komputerowych Student, który zalicza na ocenę dobry (4) (oprócz wymagań na ocenę 3): Student, który zalicza na ocenę bardzo dobry (5) (oprócz wymagań na ocenę 4): podaje strukturę dysku logicznego w wybranym systemie plików (FAT, NTFS, ext) wyjaśnia pojęcia stronicowania i segmentacji pamięci oraz opisuje zasadę działania pamięci wirtualnej charakteryzuje podstawowe protokoły sieciowe oraz topologie sieci komputerowych opisuje sposób przechowywania informacji o położeniu pliku na dysku w wybranym systemie plików (FAT, NTFS, ext) opisuje modele ISO/OSI i TCP/IP stosowane w sieciach komputerowych Rok akademicki 2014/2015, Wykład nr 1 11/66 Rok akademicki 2014/2015, Wykład nr 1 12/66 Zaliczenie wykładu - efekty kształcenia (EK2) Zaliczenie wykładu - efekty kształcenia (EK2) Student, który zaliczył przedmiot: Student, który zaliczył przedmiot: pisze i uruchamia programy zorientowane obiektowo stosując konstruktory, destruktory oraz deklaracje przyjaźni pisze i uruchamia programy zorientowane obiektowo stosując konstruktory, destruktory oraz deklaracje przyjaźni Student, który zalicza na ocenę dostateczny (3): wyjaśnia podstawowe pojęcia związane z programowaniem obiektowym charakteryzuje strumienie i operatory odpowiadające za wczytywanie i wyświetlanie danych w języku C++ oraz wyjaśnia zasadę działania manipulatorów sterujących formatem wejścia-wyjścia opisuje definicję i składniki klasy oraz prawa dostępu do składników klasy; podaje przykładową definicję klasy podaje przeznaczenie oraz sposób definiowania konstruktorów i destruktorów; wyjaśnia co to są i kiedy są stosowane funkcje zaprzyjaźnione z klasą Student, który zalicza na ocenę dobry (4) (oprócz wymagań na ocenę 3): wyjaśnia na czym polega przeładowanie/przeciążenie nazwy funkcji i kiedy jest stosowane w definicji klasy opisuje rolę wskaźnika this w funkcjach składowych klasy charakteryzuje operatory języka C++ przeznaczone do dynamicznego przydziału i zwalniania pamięci
Rok akademicki 2014/2015, Wykład nr 1 13/66 Rok akademicki 2014/2015, Wykład nr 1 14/66 Zaliczenie wykładu - efekty kształcenia (EK2) Zaliczenie wykładu - efekty kształcenia (EK3) Student, który zaliczył przedmiot: Student, który zaliczył przedmiot: pisze i uruchamia programy zorientowane obiektowo stosując konstruktory, destruktory oraz deklaracje przyjaźni tworzy w programach zorientowanych obiektowo funkcje przeładowujące operatory Student, który zalicza na ocenę bardzo dobry (5) (oprócz wymagań na ocenę 4): charakteryzuje konstruktory kopiujące i domniemane, wyjaśnia kiedy są wywoływane opisuje zastosowanie dziedziczenia i funkcji wirtualnych w programowaniu obiektowym Student, który zalicza na ocenę dostateczny (3): opisuje strukturę funkcji przeładowującej operator, podaje przykład takiej funkcji wyjaśnia różnice w definicji funkcji przeładowującej operator, w przypadku, gdy jest ona funkcją składową klasy i funkcją globalną Rok akademicki 2014/2015, Wykład nr 1 15/66 Rok akademicki 2014/2015, Wykład nr 1 16/66 Zaliczenie wykładu - efekty kształcenia (EK3) Zaliczenie wykładu Student, który zaliczył przedmiot: Dwa sprawdziany pisemne: tworzy w programach zorientowanych obiektowo funkcje przeładowujące operatory sprawdzian 1: 04.12.2014 (czwartek), godz. 12:15-13:00, WE-Aula III sprawdzian 2: 29.01.2015 (czwartek), godz. 13:15-14:00, WE-Aula III poprawa: termin do ustalenia (sesja egzaminacyjna) Student, który zalicza na ocenę dobry (4) (oprócz wymagań na ocenę 3): charakteryzuje funkcje przeładowujące operatory jednoi dwuargumentowe charakteryzuje funkcje przeładowujące operatory: << i >> Student, który zalicza na ocenę bardzo dobry (5) (oprócz wymagań na ocenę 4): wyjaśnia kiedy konieczne jest przeładowanie operatora przypisania (=) Ocena końcowa jest średnią arytmetyczną trzech ocen za trzy EK: ocena punkty średnia ocena końcowa 5 5,0 4,75-5,00 5 5-4,8 4,25-4,74 4,5 4,5 4,5 3,75-4,24 4 4 4,0 3,25-3,74 3,5 4-3,8 3,00-3,24 3 3,5 3,5 3 3,0 2 2,0
Rok akademicki 2014/2015, Wykład nr 1 17/66 Rok akademicki 2014/2015, Wykład nr 1 18/66 Terminy zajęć Plan wykładu nr 1 Wykład nr 1-09.10.2014 Wykład nr 2-23.10.2014 Wykład nr 3-06.11.2014 Wykład nr 4-20.11.2014 Wykład nr 5-04.12.2014 (sprawdzian nr 1) Wykład nr 6-18.12.2014 Wykład nr 7-15.01.2015 Wykład nr 8-29.01.2015 (1h, 13:15-14:00, sprawdzian nr 2) Operacje wejścia-wyjścia w języku C Strumienie Operacje na plikach otwarcie pliku zamknięcie pliku Typy operacji wejścia-wyjścia znakowe łańcuchowe sformatowane rekordowe (blokowe) Rok akademicki 2014/2015, Wykład nr 1 19/66 Rok akademicki 2014/2015, Wykład nr 1 20/66 Operacje wejścia-wyjścia wyjścia w języku C Typy standardowych operacji wejścia-wyjściawyjścia Operacje wejścia-wyjścia nie są elementami języka C Zostały zrealizowane jako funkcje zewnętrzne, znajdujące się w bibliotekach dostarczanych wraz z kompilatorem Standardowe wejście-wyjście (strumieniowe) plik nagłówkowy duża liczba funkcji, proste w użyciu ukrywa przed programistą szczegóły wykonywanych operacji znakowe getc() - putc() getchar() - putchar() fgetc() - fputc() ungetc() łańcuchowe gets() - puts() fgets() - fputs() rekordowe (blokowe) Systemowe wejście-wyjście (deskryptorowe, niskopoziomowe) plik nagłówkowy io.h mniejsza liczba funkcji programista sam obsługuje szczegóły wykonywanych operacji funkcje bardziej zbliżone do systemu operacyjnego - działają szybciej sformatowane scanf() - printf() fscanf() - fprintf() sscanf() - sprintf() fread() - fwrite() fgetpos() - fsetpos() fseek() ftell() rewind()
Rok akademicki 2014/2015, Wykład nr 1 21/66 Rok akademicki 2014/2015, Wykład nr 1 22/66 Strumienie Strumienie Standardowe operacje wejścia-wyjścia opierają się na strumieniach (ang. stream) Strumienie reprezentowane są przez zmienne będące wskaźnikami na struktury typu FILE (definicja w pliku ) Strumień jest pojęciem abstrakcyjnym - jego nazwa bierze się z analogii między przepływem danych, a np. wody W strumieniu dane płyną od źródła do odbiorcy Użytkownik określa źródło i odbiorcę, typ danych oraz sposób ich przesyłania Strumień może być skojarzony ze zbiorem danych znajdujących się na dysku (plik) lub zbiorem danych pochodzących z urządzenia znakowego (klawiatura) struct _iobuf char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; ; typedef struct _iobuf FILE; Niezależnie od fizycznego medium, z którym strumień jest skojarzony, wszystkie strumienie mają podobne właściwości Podczas pisania programów nie ma potrzeby bezpośredniego odwoływania się do pól tej struktury Rok akademicki 2014/2015, Wykład nr 1 23/66 Rok akademicki 2014/2015, Wykład nr 1 24/66 Strumienie Operacje na plikach W każdym programie automatycznie tworzone są i otwierane trzy standardowe strumienie wejścia-wyjścia: stdin - standardowe wejście, skojarzone z klawiaturą stdout - standardowe wyjście, skojarzone z ekranem monitora stderr - standardowe wyjście dla komunikatów o błędach, skojarzone z ekranem monitora _CRTIMP FILE * cdecl iob_func(void); #define stdin (& iob_func()[0]) #define stdout (& iob_func()[1]) #define stderr (& iob_func()[2]) Strumień wiąże się z plikiem za pomocą otwarcia, zaś połączenie to jest przerywane przez zamknięcie strumienia Operacje związane z przetwarzaniem pliku zazwyczaj składają się z trzech części 1. Otwarcie pliku (strumienia): - funkcje: fopen() 2. Operacje na pliku (strumieniu), np. czytanie, pisanie: - funkcje dla plików tekstowych: fprintf(), fscanf(), fgetc(), fputc(), fgets(), fputs() - funkcje dla plików binarnych: fread(), fwrite(), Funkcja printf() niejawnie używa strumienia stdout, zaś funkcja scanf() niejawnie używa strumienia stdin 3. Zamknięcie pliku (strumienia): - funkcja: fclose()
Rok akademicki 2014/2015, Wykład nr 1 25/66 Rok akademicki 2014/2015, Wykład nr 1 26/66 Otwarcie pliku - fopen() FOPEN FILE* fopen(const char *fname, const char *mode); Otwarcie pliku - fopen() FOPEN FILE* fopen(const char *fname, const char *mode); Otwiera plik o nazwie fname, nazwa może zawierać całą ścieżkę dostępu do pliku Otwiera plik o nazwie fname, nazwa może zawierać całą ścieżkę dostępu do pliku mode określa tryb otwarcia pliku: "r" - odczyt "w" - zapis - jeśli pliku nie ma to zostanie on utworzony, jeśli plik istnieje, to jego poprzednia zawartość zostanie usunięta "a" - zapis (dopisywanie) - dopisywanie danych na końcu istniejącego pliku, jeśli pliku nie ma to zostanie utworzony mode określa tryb otwarcia pliku: "r+" - uaktualnienie (zapis i odczyt) "w+" - uaktualnienie (zapis i odczyt) - jeśli pliku nie ma to zostanie on utworzony, jeśli plik istnieje, to jego poprzednia zawartość zostanie usunięta "a+" - uaktualnienie (zapis i odczyt) - dopisywanie danych na końcu istniejącego pliku, jeśli pliku nie ma to zostanie utworzony, odczyt może dotyczyć całego pliku, zaś zapis może polegać tylko na dodawaniu nowych danych Rok akademicki 2014/2015, Wykład nr 1 27/66 Rok akademicki 2014/2015, Wykład nr 1 28/66 Otwarcie pliku - fopen() Otwarcie pliku - fopen() FOPEN FILE* fopen(const char *fname, const char *mode); Zwraca wskaźnik na strukturę FILE skojarzoną z otwartym plikiem Gdy otwarcie pliku nie powiodło się to zwraca NULL Zawsze należy sprawdzać, czy otwarcie pliku powiodło się Po otwarciu pliku odwołujemy się do niego przez wskaźnik pliku Domyślnie plik jest otwierany w trybie tekstowym, natomiast dodanie litery "b" w trybie otwarcie oznacza tryb binarny Przykłady wywołania funkcji fopen(): FILE *stream1, *stream2, *stream3; stream1 = fopen("dane.txt","r"); stream2 = fopen("c:\\baza\\data.bin","wb"); stream3 = fopen("wynik.txt","wt"); dane.txt - tryb tekstowy, tylko do odczytu data.bin - tryb binarny, tylko do zapisu wynik.txt - tryb tekstowy, tylko do zapisu
Rok akademicki 2014/2015, Wykład nr 1 29/66 Rok akademicki 2014/2015, Wykład nr 1 30/66 Zamknięcie pliku - fclose() FCLOSE int fclose(file *stream); Zamyka plik wskazywany przez stream Zwraca 0 (zero) jeśli zamknięcie pliku było pomyślne W przypadku wystąpienia błędu zwraca EOF #define EOF (-1) Po zamknięciu pliku, wskaźnik stream może być wykorzystany do otwarcia innego pliku W programie może być jednocześnie otwartych wiele plików Przykład: otwarcie i zamknięcie pliku #include <> int main() FILE *stream; stream = fopen("plik.txt","w"); if (stream == NULL) printf("blad otwarcia pliku.\n"); return (-1); /* przetwarzanie pliku */ fclose(stream); return (0); Rok akademicki 2014/2015, Wykład nr 1 31/66 Rok akademicki 2014/2015, Wykład nr 1 32/66 Format (plik) tekstowy i binarny Format (plik) tekstowy i binarny Przykład zawartości pliku tekstowego: Dane w pliku tekstowym zapisane są w postaci kodów ASCII Deklaracja i inicjalizacja zmiennej x typu int: int x = 123456; Przykład zawartości pliku binarnego: W pamięci komputera zmienna x zajmuje 4 bajty: Po zapisaniu wartości zmiennej x do pliku tekstowego znajdzie się w nim 6 bajtów zawierających kody ASCII kolejnych cyfr 00110001 00110010 00110011 00110100 00110101 00110110 (2) '1' '2' '3' '4' '5' '6' znaki
Rok akademicki 2014/2015, Wykład nr 1 33/66 Rok akademicki 2014/2015, Wykład nr 1 34/66 Format (plik) tekstowy i binarny Format (plik) tekstowy i binarny Dane w pliku tekstowym zapisane są w postaci kodów ASCII Elementami pliku tekstowego są wiersze o różnej długości Deklaracja i inicjalizacja zmiennej x typu int: int x = 123456; W pamięci komputera zmienna x zajmuje 4 bajty: W systemach DOS/Windows każdy wiersz pliku tekstowego zakończony jest parą znaków: CR (carriage return) - powrót karetki, kod ASCII - 13 (10) = 0D (16) = '\r' LF (line feed) - przesunięcie o wiersz, kod ASCII - 10 (10) = 0A (16) = '\n' Załóżmy, że plik tekstowy ma postać: Po zapisaniu wartości zmiennej x do pliku binarnego znajdą się w nim 4 bajty o takiej samej zawartości jak w pamięci komputera Rzeczywista zawartość pliku jest następująca: Rok akademicki 2014/2015, Wykład nr 1 35/66 Rok akademicki 2014/2015, Wykład nr 1 36/66 Format (plik) tekstowy i binarny Tryby otwarcia pliku: tekstowy i binarny W systemie Linux każdy wiersz pliku tekstowego zakończony jest tylko jednym znakiem: LF (line feed) - przesunięcie o wiersz, kod ASCII - 10 (10) = 0A (16) = '\n' Załóżmy, że plik tekstowy ma postać: Różnice pomiędzy trybem tekstowym i binarnym otwarcia pliku dotyczą innego traktowania znaków: nowej linii (CR, LF) końca pliku (Ctrl+Z - kod 1A (16) ) W trybie tekstowym: Rzeczywista zawartość pliku jest następująca: przy odczycie pliku para znaków CR, LF jest tłumaczona na znak nowej linii (LF) przy zapisie pliku znak nowej linii (LF) jest zapisywany w postaci dwóch znaków (CR, LF) W trybie binarnym: przy odczycie i zapisie para znaków CR, LF jest traktowana zawsze jako dwa znaki Pliki binarne nie mają ściśle określonej struktury
Rok akademicki 2014/2015, Wykład nr 1 37/66 Rok akademicki 2014/2015, Wykład nr 1 38/66 Tryby otwarcia pliku: tekstowy i binarny Znakowe operacje wejścia-wyjściawyjścia W trybie tekstowym: koniec pliku jest sygnalizowany po napotkaniu znaku Ctrl-Z W trybie binarnym: śledzona jest całkowita długość pliku koniec pliku sygnalizowany jest wartością całkowitą -1 (FFFF (16) ) zdefiniowaną w postaci stałej EOF (end of file) GETC int getc(file *stream); Pobiera jeden znak z aktualnej pozycji otwartego strumienia stream i uaktualnia pozycję Zmienna stream powinna wskazywać strukturę FILE reprezentującą strumień skojarzony z otwartym plikiem lub jeden ze standardowo otwartych strumieni - np. stdin wartość całkowitą kodu wczytanego znaku Jeśli wystąpił błąd lub przeczytany został znacznik końca pliku, to funkcja zwraca wartość EOF Rok akademicki 2014/2015, Wykład nr 1 39/66 Rok akademicki 2014/2015, Wykład nr 1 40/66 Znakowe operacje wejścia-wyjściawyjścia Znakowe operacje wejścia-wyjściawyjścia PUTC GETCHAR int putc(int znak, FILE *stream); int getchar(void); Wpisuje znak do otwartego strumienia reprezentowanego przez argument stream Zmienna stream powinna wskazywać strukturę FILE reprezentującą strumień skojarzony z otwartym plikiem lub jeden ze standardowo otwartych strumieni - np. stdout wypisany znak Pobiera znak ze strumienia stdin (klawiatura) przeczytany znak Jeśli wystąpił błąd albo został przeczytany znacznik końca pliku, to funkcja zwraca wartość EOF Jeśli wystąpił błąd, to funkcja zwraca wartość EOF
Rok akademicki 2014/2015, Wykład nr 1 41/66 Rok akademicki 2014/2015, Wykład nr 1 42/66 Znakowe operacje wejścia-wyjściawyjścia Znakowe operacje wejścia-wyjściawyjścia PUTCHAR FGETC int putchar(int znak); int fgetc(file *stream); Wpisuje znak do strumienia stdout (standardowo ekran) Pobiera jeden znak ze strumienia wskazywanego przez stream wypisany znak przeczytany znak po przekształceniu go na typ int Jeśli wystąpił błąd, to funkcja zwraca wartość EOF Jeśli wystąpił błąd lub został przeczytany znacznik końca pliku, to funkcja zwraca wartość EOF Rok akademicki 2014/2015, Wykład nr 1 43/66 Rok akademicki 2014/2015, Wykład nr 1 44/66 Znakowe operacje wejścia-wyjściawyjścia Znakowe operacje wejścia-wyjściawyjścia FPUTC UNGETC int fputc(int znak, FILE *stream); int ungetc(int znak, FILE *stream); Wpisuje znak do otwartego strumienia reprezentowanego przez argument stream Umieszcza znak z powrotem w strumieniu wejściowym stream wypisany znak Jeśli wystąpił błąd, to funkcja zwraca wartość EOF
Rok akademicki 2014/2015, Wykład nr 1 45/66 Rok akademicki 2014/2015, Wykład nr 1 46/66 Przykład: wyświetlenie pliku tekstowego Przykład: wyświetlenie pliku tekstowego #include <> FILE *plik; int znak; plik = fopen("test.txt","r"); while ((znak=getc(plik))!=eof) putc(znak,stdout); fclose(plik); Inny sposób czytania znaków z pliku: while ((znak=fgetc(plik))!=eof) Inne sposoby wyświetlania znaków: putchar(znak); fputc(znak,stdout); printf("%c",znak); Rok akademicki 2014/2015, Wykład nr 1 47/66 Rok akademicki 2014/2015, Wykład nr 1 48/66 Przykład: liczba znaków wczytanych z klawiatury Przykład: liczba wyrazów w pliku #include <> int znak; int ile = 0; Ala ma laptopa Liczba znakow: 14 #include <> FILE *plik; int znak, odstep = 1, ile = 0; while ((znak=getchar())!='\n') ile++; printf("liczba znakow: %d\n",ile); Wprowadzane znaki są buforowane do naciśnięcia klawisza Enter Po naciśnięciu klawisza Enter zawartość bufora jest przesyłana do programu i analizowana w nim plik = fopen("test.txt","r"); while ((znak = getc(plik))!= EOF) if (znak == ' ' znak == '\t' znak == '\n') odstep++; else if (odstep!= 0) odstep = 0; ile++; fclose(plik); printf("liczba slow: %d\n",ile);
Rok akademicki 2014/2015, Wykład nr 1 49/66 Rok akademicki 2014/2015, Wykład nr 1 50/66 Łańcuchowe operacje wejścia-wyjściawyjścia Łańcuchowe operacje wejścia-wyjściawyjścia GETS PUTS char* gets(char *buf); int puts(const char *buf); Pobiera do bufora pamięci wskazywanego przez argument buf linię znaków ze strumienia stdin (standardowo klawiatura) Wpisuje łańcuch buf do strumienia stdout (standardowo ekran), zastępując znak '\0' znakiem '\n' Wczytywanie jest kończone po napotkaniu znacznika nowej linii '\n', który zastępowany jest znakiem końca łańcucha '\0' ostatni wypisany znak Funkcja gets() umożliwia wczytanie łańcucha znaków zawierającego spacje i tabulatory Jeśli wystąpił błąd, to funkcja zwraca wartość EOF wskazanie do łańcucha buf Jeśli wystąpił błąd lub podczas wczytywania został napotkany znacznik końca pliku, to funkcja zwraca wartość EOF Rok akademicki 2014/2015, Wykład nr 1 51/66 Rok akademicki 2014/2015, Wykład nr 1 52/66 Łańcuchowe operacje wejścia-wyjściawyjścia Łańcuchowe operacje wejścia-wyjściawyjścia FGETS FPUTS char* fgets(char *buf, int max, FILE *stream); int fputs(const char *buf, FILE *stream); Pobiera do bufora pamięci wskazanego przez buf co najwyżej max-1 znaków z otwartego strumienia reprezentowanego przez stream Przerywa czytanie po napotkaniu znacznika końca linii '\n' Wpisuje łańcuch buf do strumienia stream, nie dołącza znaku końca wiersza '\n' ostatni wypisany znak Po ostatnim przeczytanym znaku wstawia do bufora buf znak '\0' Jeśli wystąpił błąd, to funkcja zwraca wartość EOF wskazanie do łańcucha buf Jeśli wystąpił błąd lub napotkano znacznik końca pliku, to funkcja zwraca wartość NULL
Rok akademicki 2014/2015, Wykład nr 1 53/66 Rok akademicki 2014/2015, Wykład nr 1 54/66 Przykład: wyświetlenie pliku tekstowego #include <> FILE *plik; char buf[10]; plik = fopen("test1.cpp","r"); while (fgets(buf,10,plik)!=null) fputs(buf,stdout); fclose(plik); Sformatowane operacje wejścia-wyjściawyjścia SCANF int scanf(const char *format,...); Czyta dane ze strumienia stdin (klawiatura) FSCANF int fscanf(file *stream, const char *format,...); Czyta dane z otwartego strumienia stream SSCANF int sscanf(char *buf, const char *format,...); Czyta dane z bufora pamięci wskazywanego przez buf Rok akademicki 2014/2015, Wykład nr 1 55/66 Rok akademicki 2014/2015, Wykład nr 1 56/66 Sformatowane operacje wejścia-wyjściawyjścia PRINTF int printf(const char *format,...); Wyprowadza dane do strumienia stdout (ekran) FPRINTF int fprintf(file *stream, const char *format,...); Wyprowadza dane do otwartego strumienia stream SPRINTF int sprintf(char *buf, const char *format,...); Wyprowadza dane do bufora pamięci wskazywanego przez buf Przykład: zapisanie danych do pliku tekstowego #include <> FILE *plik; char imie[10] = "Jan"; char nazw[10] = "Kowalski"; int wiek = 21; float wzrost = 1.78; plik = fopen("dane.txt","w"); fprintf(plik,"imie: %s\n",imie); fprintf(plik,"nazwisko: %s\n",nazw); fprintf(plik,"wiek: %d [lat]\n",wiek); fprintf(plik,"wzrost: %.2f [m]\n",wzrost); fclose(plik); Imie: Jan Nazwisko: Kowalski Wiek: 21 [lat] Wzrost: 1.78 [m]
Rok akademicki 2014/2015, Wykład nr 1 57/66 Rok akademicki 2014/2015, Wykład nr 1 58/66 Obsługa błędów wejścia-wyjściawyjścia Przykład: odczytanie liczb z pliku tekstowego FEOF int feof(file *stream); Sprawdza, czy podczas ostatniej operacji wejścia dotyczącej strumienia stream został osiągnięty koniec pliku Zwraca wartość różną od zera, jeśli podczas ostatniej operacji wejścia został wykryty koniec pliku, w przeciwnym razie zwraca wartość 0 (zero) #include <> FILE *plik; int x; plik = fopen("liczby.txt","r"); fscanf(plik,"%d",&x); while(!feof(plik)) printf("%d\n",x); fscanf(plik,"%d",&x); fclose(plik); 3 51 93 10 93 64 63 0 46 24 Rok akademicki 2014/2015, Wykład nr 1 59/66 Rok akademicki 2014/2015, Wykład nr 1 60/66 Przykład: odczytanie liczb z pliku tekstowego Rekordowe (blokowe) operacje wejścia-wyjściawyjścia Sposób zapisu liczb w pliku wejściowym nie ma znaczenia dla prawidłowości ich odczytu Liczby powinny być oddzielone od siebie znakami spacji, tabulacji lub znakiem nowego wiersza FWRITE size_t fwrite(const void *p, size_t s, size_t n, FILE *stream); Zapisuje n elementów o rozmiarze s bajtów każdy, do pliku wskazywanego przez stream, biorąc dane z obszaru pamięci wskazywanego przez p Zwraca liczbę zapisanych elementów - jeśli jest ona różna od n, to wystąpił błąd zapisu (brak miejsca na dysku lub dysk zabezpieczony przed zapisem)
Rok akademicki 2014/2015, Wykład nr 1 61/66 Rok akademicki 2014/2015, Wykład nr 1 62/66 Przykład: zapisanie danych do pliku binarnego #include <> FILE *plik; int x = 10; int tab[5] = 1,2,3,4,5; float y = 1.2345; plik = fopen("dane.dat","wb"); fwrite(&x,sizeof(int),1,plik); fwrite(tab,sizeof(int),5,plik); fwrite(tab,sizeof(tab),1,plik); fwrite(&y,sizeof(float),1,plik); fclose(plik); Rekordowe (blokowe) operacje wejścia-wyjściawyjścia FREAD size_t fread(void *p, size_t s, size_t n, FILE *stream); Pobiera n elementów o rozmiarze s bajtów każdy, z pliku wskazywanego przez stream i umieszcza odczytane dane w obszarze pamięci wskazywanym przez p Zwraca liczbę odczytanych elementów - w przypadku gdy liczba ta jest różna od n, to wystąpił błąd końca strumienia (w pliku było mniej elementów niż podana wartość argumentu n) Rok akademicki 2014/2015, Wykład nr 1 63/66 Rok akademicki 2014/2015, Wykład nr 1 64/66 Przykład: odczytanie liczb z pliku binarnego Przykład: odczytanie liczb z pliku binarnego #include <> FILE *plik; int x, ile = 0; plik = fopen("liczby.dat","rb"); fread(&x,sizeof(int),1,plik); while (!feof(plik)) ile++; printf("%d\n",x); fread(&x,sizeof(int),1,plik); fclose(plik); printf("odczytano: %d liczb\n",ile); 37 31 83 27 6 62 31 50 Odczytano: 8 liczb Po otwarciu pliku wskaźnik pozycji pliku pokazuje na jego początek Po odczytaniu jednej liczby: fread(&x,sizeof(int),1,plik); wskaźnik jest automatycznie przesuwany o sizeof(int) bajtów Po odczytaniu kolejnej liczby: fread(&x,sizeof(int),1,plik); wskaźnik jest ponownie przesuwany o sizeof(int) bajtów Plik binarny zawiera liczby: 37 31 83 27 6 62 31 50
Rok akademicki 2014/2015, Wykład nr 1 65/66 Rok akademicki 2014/2015, Wykład nr 1 66/66 Przykład: operacje na pliku tekstowym i binarnym Koniec wykładu nr 1 #include <> FILE *plik1, *plik2; int x; plik1 = fopen("liczby.dat","rb"); plik2 = fopen("liczby.txt","w"); fread(&x,sizeof(int),1,plik1); while (!feof(plik1)) fprintf(plik2,"%d\n",x); fread(&x,sizeof(int),1,plik1); fclose(plik1); fclose(plik2); Dziękuję za uwagę!