INFORMATYKA Studia Niestacjonarne Elektrotechnika Wydział Elektrotechniki i Informatyki dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel. 81-538-42-93 m.lanczont@pollub.pl http://lanczont.pollub.pl Operacje Wejścia - Wyjścia o Terminal jako standardowy port wymiany danych pomiędzy użytkownikiem a programem o Port wejściowy klawiatura o Port wyjściowy ekran o Wymiana danych może także być realizowana poprzez zapis i odczyt danych z pliku o Standardowe funkcje realizujące operacje wejścia i wyjścia dostępne są w bibliotece stdio.h 2 1
printf o Funkcja printf realizuje wysyłanie danych na ekran o Dostarcza narzędzi formatujących sposób wyświetlania danych o Realizowane jest to poprzez odpowiednie kodowanie po znaku % %[flagi][szerokość][.precyzja][hll]typ o Pola opcjonalne są w [], muszą być umieszczone w podanej kolejności 3 printf - flagi o : wyrównanie wartości do lewej strony o + : poprzedzenie wartości znakiem +/ o (spacja) : poprzedzenie spacją wartości dodatnich o 0 : dopełnianie liczb zerami o # : poprzedzenie wartości ósemkowej cyfrą 0, wartości szesnastkowej napisem 0x (lub 0X); w przypadku wartości zmiennoprzecinkowych pokazanie kropki dziesiętnej; w przypadku formatów g i G zostawienie końcowych zer 4 2
printf o Szerokość określa liczbę stanowiącą minimalną szerokość pola, (*) następny parametr z listy definiuje szerokość o Precyzja (.liczba) minimalna liczba cyfr dla liczb całkowitych; liczba miejsc dziesiętnych dla formatów e i f; maksymalna liczba cyfr znaczących dla formatu g; maksymalna liczba znaków dla formatu s, (.*) następny parametr z listy definiuje precyzję o Flagi hll umieszczane przed znakiem typu rozszerzające zakres działania 5 printf znaki konwersji i lub d : liczby całkowitej u : liczby całkowitej bez znaku o : liczby całkowitej ósemkowej x (X) : liczby całkowitej szesnastkowej; jako cyfry są używane znaki a-f (A-F) f : liczby zmiennoprzecinkowej, domyślnie z sześcioma miejscami po przecinku e : liczby w notacji naukowej (wykładnik po e) a : liczby zmiennoprzecinkowej w formacie szesnastkowym, 0xd.ddddp±d c : pojedynczego znaku s : łańcucha znakowego zakończonego znakiem null 6 3
Przykład 1 7 Przykład 1 8 4
Przykład 1 9 Przykład 1 10 5
scanf o Funkcja scanf realizuje przypisanie do wskazanych zmiennych danych wprowadzanych z klawiatury o Formatowanie danych wejściowych realizowane jest podobnie jak w printf o Funkcja pobiera dane ograniczone znakami białymi : spacje, tabulatory '\t', tabulatory pionowe '\v', znaki powrotu karetki '\r', znaki nowego wiersza '\n' lub nowej strony '\f' scanf( znaki formatujące, wskaźniki do zmiennych); 11 scanf Znaki formatujące zapisywane są w układzie: %[*][szerokość][prefiks]znak_konwersji * : pominięcie kolejnego pola znaków ze strumienia wejściowego szerokość : określa maksymalną liczbę znaków, które mają być pobrane z kolejnego pola 12 6
scanf typ konwersji znak wejściowe typ konwersji pole znaków wskaźnika d liczba całkowita dziesiętna int D liczba całkowita dziesiętna long o liczba całkowita oktalna int O liczba całkowita oktalna long i liczba całkowita dziesiętna int, oktalna lub heksadecymalna I liczba całkowita dziesiętna long, oktalna lub heksadecymalna u liczba całkowita dziesiętna bez znaku unsigned int U liczba całkowita dziesiętna bez znaku unsigned long x liczba całkowita heksadecymalna int X liczba całkowita heksadecymalna long e, E liczba zmiennopozycyjna float f liczba zmiennopozycyjna float g, G liczba zmiennopozycyjna float s ciąg znaków char c znak char 13 scanf prefix prefiks znaki konwersji typ wskaźnika h d, i, o, u, x short l d, i, o, u, x long e, f, g double L e, f, g long double 14 7
Zapis danych o Najprostszym sposobem zapisania danych wyjściowych programu jest przekierowanie standardowego wyjścia z ekranu na plik o Realizuje się to z poziomu konsoli przy wywołaniu programu nazwa.exe > plik_danych.txt o Problem pojawia się gdy program musi pobrać jakieś dane od użytkownika 15 Przykład 2 Wywołanie program > wynik.txt 16 8
Odczyt danych o W analogiczny sposób można zrealizować pobranie danych z pliku o W momencie gdy funkcja scanf chce przypisać dane z wejścia do zmiennej pobiera dane z pliku program < dane.txt 17 Odczyt i zapis danych o Za pomocą znaków przekierowania można zrealizować oba zadania o Pobrać dane z pliku o Wszystkie wyniki zapisać do pliku 18 9
Odczyt danych Podczas odczytu danych z pliku istotnym zagadnieniem jest rozpoznanie końca pliku (danych) Jest to szczególnie istotne gdy zadanie realizowane jest w pętli Biblioteka stdio.h dostarcza definicję flagi EOF która jest tożsama z znakiem końca pliku 19 Przykład 3 20 10
Dostęp do plików W wielu sytuacjach korzystanie z znaków przekierowania może nie być wystarczające o Program posiada interfejs użytkownika o Nie można przewidzieć wartości pobieranych danych o Chcemy selektywnie zapisywać dane o Zapis i odczyt danych realizowany jest do wielu różnych plików 21 Dostęp do plików Korzystanie z poziomu kodu z dostępu do plików realizowane jest zgodnie z procedurą o Otwarcie dostępu do pliku, z wyborem trybu pracy o Zapis lub odczyt danych z pliku o Zamknięcie dostępu do pliku 22 11
Otwarcie dostępu o Dostęp do pliku realizowany jest funkcją fopen z biblioteki stdio.h Zmienna_plikowa = fopen ( plik, tryb ); o Jeżeli z jakiegoś powodu nie można otworzyć dostępu do pliku funkcja fopen zwróci wartość NULL o Tryb dostępu może być normalny albo aktualizacji 23 Otwarcie dostępu o o o o o Dostęp może być otwarty w trybie o Odczytu r, r+ o Zapisu w, w+ o Dopisywania a, a+ W pierwszym trybie plik musi istnieć W drugim i trzecim, jeżeli plik nie istnieje zostanie utworzony W trybie drugim w istniejącym pliku dane zostaną nadpisane. W trybie aktualizacji (+) możliwy jest zarówno zapis jak i odczyt danych 24 12
Otwarcie dostępu o Korzystanie z funkcji fopen wymaga utworzenia zmiennej wskazującej na plik o Biblioteka stdio.h dostarcza odpowiedni typ FILE *zmienna_plikowa; o Do utworzonej zmiennej następnie funkcją fopen można przypisać plik o Otwarcie dostępu do pliku warto realizować poprzez funkcję if sprawdzającą poprawność otwarcia 25 Odczyt i zapis danych o Odczytanie pojedynczego znaku z pliku realizuje funkcja: zmienna=getc(nazwa_pliku); o Zapisanie pojedynczego znaku do pliku realizuje funkcja: putc( znak,nazwa_pliku); o Zamykanie dostępu do pliku realizuje funkcja: fclose(nazwa_pliku); 26 13
Przykład 4 27 Koniec pliku Biblioteka stdio.h dostarcza funkcję wykrywania końca pliku 28 14
Odczyt i zapis danych Odczyt i zapis sformatowanych ciągów tekstowych realizuje się za pomocą funkcji o fprintf zapis danych o fscanf odczyt danych o Funcje działają analogicznie do printf i scanf. o W obu dochodzi jedne początkowy parametr zawierający wskaźnik do pliku o Fscanf po dojściu do końca pliku zwraca EOF 29 Operacje na plikach o Z poziomu kodu możliwa jest zmian nazwy pliku rename( stara_nazwa, nowa_nazwa ); o Możliwe jest także skasowanie pliku remove( nazwa_pliku ); o Obydwie funkcje wymagają aby dostęp do pliku był zamknięty 30 15
Przykład 5 31 Przykład 6 32 16
Zapis i odczyt danych o Funkcje fputs i fgets umożliwiają odczytanie i zapisanie danych do i z bufora (tekstowego) o Operowanie na większych blokach danych jest dzięki nim wygodniejsze jak za pomocą funkcji fprintf i fscanf fputs(bufor, plik); fgets(bufor,limit,plik); o Funkcja odczytuje dane z pliku i umieszcza je w buforze, do czasu odczytania limit-1 znaków lub natrafieniu na znak końca wiersza lub pliku 33 Przykład 7 34 17
Przykład 8 35 18