Podstawy programowania dr inż. Robert Arsoba Ćwiczenie 13 Obsługa plików binarnych Cel ćwiczenia Celem ćwiczenia jest praktyczne zapoznanie się z zasadami obsługi plików binarnych z poziomu programów tworzonych w języku C oraz wykształcenie umiejętności stosowania odpowiednich funkcji biblioteki standardowej do obsługi plików binarnych. Zakres ćwiczenia obejmuje operacje związane z uzyskaniem dostępu do pliku i otwarciem pliku w trybie binarnym, operacje odczytu bajtów z pliku (funkcja fread) i zapisu bajtów do pliku (funkcja fwrite). Przygotowanie się do ćwiczenia • • • Zapoznać się z wykładem dotyczącym obsługi plików. • Zwrócić uwagę na ogólny schemat obsługi pliku. • Przeanalizować czynności występujące w schemacie obsługi pliku i skojarzyć z nimi odpowiednie funkcje biblioteki standardowej dla plików binarnych. • Ustalić zasady otwierania pliku binarnego w różnych trybach (do odczytu, do zapisu, do dopisywania na końcu). Zapoznać się z przykładowym programem zamieszczonym w opisie ćwiczenia (program zapisujący i odczytujący dane osobowe do pliku binarnego). • Przeanalizować kod źródłowy programu. • Zwrócić uwagę na sposób przekazywania parametrów do funkcji main. • Skompilować i uruchomić program, przetestować jego działanie. Zrealizować samodzielnie zadania ćwiczeniowe. • Opracować dla poszczególnych zadań algorytmy w postaci schematów blokowych. • Na podstawie algorytmów utworzyć kod źródłowy programów. Zadania do wykonania 1. Napisać program wyświetlający na ekranie rozmiar w bajtach pliku, którego nazwa przekazywana jest jako argument wywołania programu. 2. Napisać program tworzący kopię pliku, uruchamiany z dwoma parametrami w wierszu poleceń: pierwszy parametr to nazwa pliku kopiowanego, drugi parametr to nazwa tworzonej kopii. 3. Napisać program porównujący zawartość dwóch plików. Program powinien być uruchamiany w wierszu poleceń z dwoma parametrami: pierwszy parametr to nazwa pierwszego z porównywanych plików, drugi parametr to nazwa drugiego pliku. 4. Napisać program, który wykonuje następujące czynności: • zadaje pytanie o liczbę losowych wartości całkowitych, które należy wygenerować, Materiały przygotowano w ramach projektu „Inżynier pilnie poszukiwany” Strona 1 Podstawy programowania dr inż. Robert Arsoba • • • • zadaje pytanie o zakres z którego losowane będą wartości, generuje zadaną liczbę wartości losowych, zapisuje do pliku binarnego liczbę wygenerowanych wartości, zapisuje do pliku binarnego kolejne wygenerowane wartości. 5. Napisać program wczytujący z pliku binarnego dane zapisane przez program z zadania 3, a następnie wyświetlający na ekranie średnią arytmetyczną wczytanych liczb. Wymagana zawartość sprawozdania z ćwiczenia 1. Notatki ze schematami blokowymi algorytmów do zadań. 2. Pliki z kodem źródłowym utworzonych programów. Zalecane źródła wiedzy 1. B. Kernighan, D. Ritchie: „Język ANSI C”, WNT, Warszawa 2001. Przykładowy program /* * Odczyt i zapis danych osobowych do pliku binarnego * Robert Arsoba * 1.12.2009 * Wersja 1.0 */ #include <stdio.h> /* fflush, fopen, fclose, fread, fwrite, printf, scanf */ #include <stdlib.h> /* funkcja system */ /* typ strukturalny opisujacy date urodzenia */ typedef struct { int dzien, mies, rok; } data; /* typ strukturalny opisujacy dane osobowe */ typedef struct { char imie[15]; char nazwisko[20]; data data_ur; /* struktura zagniezdzona */ } osoba; int main() { FILE *plik; osoba pracownik; char znak; /* wskaznik pliku */ /* zmienna strukturalna */ /* znak wprowadzany z klawiatury */ Materiały przygotowano w ramach projektu „Inżynier pilnie poszukiwany” Strona 2 Podstawy programowania dr inż. Robert Arsoba system("cls"); if ( (plik = fopen("dane.dat", "wb")) == NULL ) /* otwarcie pliku binarnego do zapisu i sprawdzenie poprawnosci otwarcia */ { printf("Blad otwarcia pliku\n"); system("pause"); return -1; } do /* petla wczytujaca dane do struktury pracownik i zapisujaca do pliku */ { system("cls"); printf("Wprowadzanie danych:\n"); printf("Nazwisko: "); fflush(stdin); /* wyczyszczenie bufora wejsciowego */ gets(pracownik.nazwisko); printf("Imie : "); fflush(stdin); gets(pracownik.imie); printf("Data urodzenia [r m d]: "); fflush(stdin); scanf("%d %d %d", &pracownik.data_ur.rok, &pracownik.data_ur.mies, &pracownik.data_ur.dzien); /* zapis do pliku pojedynczej struktury typu osoba (zmienna pracownik) */ fwrite(&pracownik, sizeof(pracownik), 1, plik); printf("\nk - koniec wprowadzania danych Enter - kontynuacja\n\n"); fflush(stdin); /* odczyt znaku z klawiatury */ znak = getchar(); } while (znak != 'k' && znak != 'K'); fclose(plik); /* zamkniecie pliku */ if ( (plik = fopen("dane.dat", "rb")) == NULL ) /* otwarcie pliku binarnego do odczytu i sprawdzenie poprawnosci otwarcia */ { printf("Blad otwarcia pliku\n"); system("pause"); return -1; } system("cls"); printf("%-20s %-15s %10s\n", "NAZWISKO", "IMIE", "DATA URODZENIA"); printf("------------------------------------------------------\n"); while (fread(&pracownik, sizeof(pracownik), 1, plik) > 0) /* do konca pliku */ /* odczyt z pliku pojedynczej struktury typu osoba do zmiennej pracownik */ printf("%-20s %-15s %4d-%02d-%02d\n", pracownik.nazwisko, pracownik.imie, pracownik.data_ur.rok, pracownik.data_ur.mies, pracownik.data_ur.dzien); fclose(plik); printf("\n"); system("pause"); return 0; } Materiały przygotowano w ramach projektu „Inżynier pilnie poszukiwany” Strona 3