plik binarny - Robert Arsoba

Transkrypt

plik binarny - Robert Arsoba
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