Inf 2 10

background image

UNIWERSYTET TECHNOLOGICZNO-PRZYRODNICZY

w Bydgoszczy

ZAKŁAD ELEKTROENERGETYKI

LABORATORIUM INFORMATYKI

INSTRUKCJA DO ĆWICZENIA X

Pliki tekstowe i binarne


Opracował: dr inż. Marcin Drechny



Luty 2010 r.

background image

2

1.

Celem ćwiczenia jest:

Celem tego ćwiczenia jest poznanie i utrwalenie podstawowych operacji związanych

z trwałym zapisywaniem i odczytywaniem danych programowych znajdujących się

w plikach tekstowych i binarnych przy podejściu tradycyjnym i obiektowym.

2.

Wprowadzenie

Jedną z podstawowych i najważniejszych umiejętności programistycznych jest

zarządzanie zasobami plikowymi. Pliki są podstawowymi zdefiniowanymi „kontenerami”

danych, trwale zapisanymi w zasobach dyskowych komputera.

Pliki możemy podzielić następująco:

a) pod względem funkcjonalnym na

- pliki tekstowe (zawierające podstawowe znaki ASCII np. znaki alfabetu),

- pliki binarne (zawierające bajty o kodzie od 0 do 255) np. pliki wykonywalne

z rozszerzeniem *.exe, *.com.

b) pod względem struktury wewnętrznej na

- pliki sekwencyjne,

- pliki o dostępie swobodnym ( pliki baz danych ).

Podstawowymi operacjami niezbędnymi do obsługi plików są:

- operacja otwarcia pliku,

- operacja zapisu do pliku,

- operacja odczytu z pliku,

- operacja zamknięcia pliku,

- operacje dyskowego zarządzania plikiem (kopiowanie, usuwanie

przemieszczanie pliku, oraz tworzenie nowego pliku).

Kolejność operacji wykonywanych na pliku przedstawia rysunek 1.

Znajomość

powyższych

zagadnień

umożliwia

realizowanie

podstawowego

celu

w programowaniu, a mianowicie – przetwarzanie informacji lub danych.






background image

3



















Wszystkie funkcje pozwalające na wykonanie operacji na plikach znajdują się w

standardowej wewnętrznej bibliotece C/C++. Ich prototypy określone sa w zbiorze

nagłówkowym stdio.h

Podstawowymi operacjami niezbędnymi do obsługi plików są:

• operacja otwarcia pliku,

• operacja zapisu do pliku,

• operacja odczytu z pliku,

• operacja zamknięcia pliku,

• operacje dyskowego zarządzania plikiem (kopiowanie, usuwanie przemieszczanie pliku,

oraz tworzenie nowego pliku).


2.1 Otwarcie pliku

FILE *

fopen

(const char *patch, const char *mode);


Funkcja fopen otwiera plik o nazwie i ścieżce dostępu określonej parametrem path i wiąże z

tym plikiem strumień,. Parametr mode służy do określenia sposobu, celu otwarcia oraz trybu

pracy strumienia. Ogólny format tego parametru przedstawia się następująco:

sposób-i-cel-otwarcia[tryb]


Gdzie sposób i cel otwarcia podane są w poniższej tabeli natomiast tryb pracy określany jest

literką:

Otwarcie pliku

Operacje odczytu
z pliku

Operacje zapisu
do pliku

Zamknięcie pliku

DYSK

PRZETWARZANIE INFORMACJI

Dane wejściowe

Dane wyjściowe

Fizyczna lokalizacja
pliku

Rys. 1 Miejsce pliku w systemie przetwarzania informacji

background image

4

‘b’ dla pliku binarnego,

‘t’ dla pliku tekstowego brak trybu oznacza plik tekstowy

wt

otwarcie pliku do zapisu

wt+

otwarcie pliku do zapisu i odczytu

rt

otwarcie pliku do odczytu

rt+

otwarcie pliku do odczytu i zapisu

wt+ różni się od rt+ tym, że w pierwszym przypadku mamy możliwość zapisu, jak i zarówno odczytu, ale

zostanie utworzony nowy plik, natomiast w drugim wypadku plik nie zostanie utworzony, tylko zostanie otwarty

do odczytu i zapisu już istniejący plik. Jeżeli chcemy otworzyć już istniejący plik (chociaż taki naprawdę nie

znajduje się na dysku) zmienna plik przyjmie wartość NULL. Możemy więc w ten sposób sprawdzić, czy udało

się otworzyć plik, czy też nie:

Przykład 1:

plik=fopen("plik.txt","rt");

if

( plik==NULL ) printf("Nie można otworzyc pliku!");

Listing 1: otwarcie pliku

Przykład 2:

FILE *plik;

char

bufor[50];

background image

5

plik=fopen("plik.txt","rt");

if

( plik==NULL ) { printf("Nie moge otworzyc pliku!");

return

0;}

fgets(bufor, 50, plik);

printf("%s",bufor);

fclose(plik);

2.2 Zapis do pliku

Po otwarciu pliku możemy dokonywać zapisu następującymi funkcjami:

fwrite

( const void *co,int rozmiar, int n, FILE *plik )

Wskazana funkcja wysyła do pliku „n” elementów o rozmiarze „ rozmiar” bajtów

pobranych z pliku wskazanego parametrem „plik”. W przypadku powodzenia operacji

wartością funkcji staje się liczba wszystkich wysłanych elementów (nie bajtów), a w

przypadku błędu wartość zero.

int

fputc

( int c, FILE *plik)

Funkcja wysyła znak określony parametrem c do pliku wskazanego parametrem plik.

Wartością funkcji jest wysłany znak, w przypadku błędu zaś EOF.

int

fputs

( const char *s, FILE *plik)

Funkcja wysyła łańcuch wskazany parametrem s do pliku wskazanego parametrem plik.

Funkcja nie dołącza znaku końca

wiersza (‘\n’), natomiast znak końca łańcucha (‘\0’) nie

zostaje wysłany. W przypadku powodzenia operacji wartość funkcji jest nieujemna, w

przeciwnym razie EOF.

Inną funkcją do zapisu w plikach tekstowych jest punkcja

fprintf

(FILE *plik,const char *format, ...)

Parametry formatowania takie same jak w printf()


Listing 2: Zapis struktury do pliku




background image

6









































2.3 Odczyt z pliku

Po otwarciu pliku możemy dokonywać odczytu z pliku następującymi funkcjami:

int

fread

(void *dokad, int rozmiar, int n, FILE *plik )

background image

7

Wskazana funkcja odczytuje z pliku „n” elementów danych o rozmiarze „rozmiar” bajtów i

zapamiętuje odczytane dane w bloku pamięci wskazanych parametrem „dokad”. Wartością

funkcji w przypadku powodzenia operacji lub osiągnięcia końca zbioru jest liczba

rzeczywiście odczytanych elementów.

int

fgetc

( FILE *plik)

Funkcja ta odczytuje następny znak z pliku. Jeśli operacja powiodła się wartością funkcji jest

odczytany znak (po konwersji do typu int) W przypadku osiągnięcia końca zbioru wartością

funkcji jest EOF.

char *

fgets

( char *s, FILE *plik)

Funkcja ta odczytuje znaki z pliku wskazanego parametrem plik i umieszcza je w łańcuchu

s

. Odczyt jest przerywany po odczytaniu n-1 znaków lub końca wiersza, Funkcja umieszcza

na końcu łańcucha s znak końca wiersza oraz znak ’\o’. Oznaczający koniec łańcucha.

Wartością funkcji jest jest łańcuch s, a w przypadku błędu – adres pusty NULL.

Inną funkcją wykorzystywaną głównie w plikach tekstowych jest fscanf()

Listing

3: Odczyts struktury z pliku





























background image

8

2.4 Sterowanie wskaźnikiem pozycji w pliku

int

fseek

( FILE *plik, long przesuniecie, int pozycja)

Funkcja zmienia wartość wskaźnika pozycji w pliku na oddaloną o „przesuniecie” bajtów od

pozycji określonej parametrem „pozycja” (poniższa tabela)

STAŁA

WARTOŚĆ

POZYCJA W PLIKU

SEEK_SET

0

początek

SEEK_CUR

1

aktualna

SEEK_END

2

koniec


Wartość parametru „przesunięcie” oznaczającego przesunięcie względem pozycji, może być

zarówno ujemna (przesuniecie wstecz) jak i dodatnia (przesuniecie w przód).

Wartością funkcji staje się zero, jeśli przesunięcie wskaźnika powiodło się, lub wartość różna

od zera w przypadku błędu.


Listing 4: Funkcja przesunięcia wskaźnika w pliku





long

ftell

( FILE *plik)

Wartością powyższej funkcji jest aktualny wskaźnik pozycji w pliku Wartość ta jest mierzona

w bajtach od początku pliku (jeśli plik jest binarny)

void

rewind

( FILE *plik)

Funkcja ta przesuwa wskaźnik na początek pliku co jest równoważne z

fseek

( f1, 0L, SEEK_SET)


Listing 5: Przykład zapisu do pliku








background image

9



















Listing 6: Przykład odczytu z pliku






















2.5 Podejście obiektowe do operacji na plikach

Podejście obiektowe do operacji na plikach zostało zaimplementowane dopiero w C++.

Korzysta się tu z standardowej klasy zdefiniowanej w pliku nagłówkowym fstream.h. Klasa

ta została wyprowadzona z innej klasy istream i reprezentuje strumień wejściowy znajdujący

się w pliku dyskowym. Od swojego przodka różni się tylko funkcjami realizującymi otwarcie

pliku.

background image

10

Otwarcie strumienia dla odczytu realizuje się w następujący sposób:

ifstream

nazwa_strumienia

(char *

nazwa_pliku_powiązanego

,int

tryb_otw=

ios

::)

Otwarcie strumienia dla zapisu realizuje się za pośrednictwem innej klasy „ofstream”

(zdefiniowanej w fstream.h) wyprowadzonej z klasy nadrzędnej ostream. Składowe tej klasy

zapewniają otwarcie zbioru i umieszczenia w nim strumieni danych. Stworzenie tej klasy

realizuje się w następujący sposób:

ofstream

nazwa_strumienia

(char *

nazwa_pliku_powiązanego

,int

tryb_otw=

ios

::)

Powyższa instrukcja stworzy strumień wyjściowy i otwiera dla niego plik o nazwie podanej w

pierwszym parametrze.

Tryby pracy strumienia określa się za pomocą stałych przedstawionych w poniższej tabeli:

Tryby otwarcia pliku

Stała

wartość

Znaczenie

in

0x01

Otwarcie do odczytu.

out

0x02

Otwarcie do zapisu.

ate

0x04

Przesuń wskaźnik pozycji na koniec pliku podczas otwierania.

app

0x08

Zapis danych na końcu zbioru (append).

trunc

0x10

Pozbądź się zawartości pliku, jeśli już istnieje.

nocreate

0x20

Próba otwarcia nie powiedzie się jeśli wskazany plik nie istnieje.

noreplace

0x40

Próba otwarcia nie powiedzie się jeśli wskazany plik istnieje.

binary

0x80

Tryb binarny pracy strumienia (normalnie tekstowy).












background image

11





Listing 7: Przykład zapisu do pliku - podejście strumieniowe




















Listing 8: Przykład odczytu z pliku - podejście strumieniowe






















Wynik działania programu Plik.txt







background image

12








background image

13

3.

Przebieg ćwiczenia – zadania do wykonania

Pliki tekstowe

3.1 Napisać program do podziału (zadanego przez prowadzącego) pliku tekstowego na pliki

o mniejszym rozmiarze. Program ma dokonywać podziału na poziomie kolejnych linii

tekstowych (przy użyciu instrukcji fgetchar lub fgets) Stosunek podziału podaje

prowadzący ćwiczenia (np. podział 1 do 5 – zadany plik zostaje podzielony na 5

mniejszych).

Przed przystąpieniem do pisania programu narysować algorytm działania oraz

skonsultować go z prowadzącym.

3.2. Zrealizować osobny program, którego zadaniem będzie scalenie podzielonych plików.

Przed przystąpieniem do pisania kodu źródłowego opracować algorytm działania

programu.

3.2 Dana jest tablica char dana[100] = ”To jest linia 1\n To jest linia 2\n To jest linia 3\n”.

Wykorzystując funkcję fputc zapisać zawartość tablicy do pliku:

a) o nazwie dane_tt.dat w trybie otwarcia tekstowego (wt);

b) o nazwie dane_tb.dat w trybie otwarcia binarnego (wb).

Wykorzystując funkcję fgetc wczytać do bufora unsigned char buf[100] dane zapisane w

pliku dane_tt.dat w trybie otwarcia tekstowego (rt) oraz w trybie otwarcia binarnego (rb).

Dla każdego z trybów wyprowadzić na ekran zawartości buforów oraz liczby wczytanych

znaków. Powtórzyć operacje dla pliku dane_tb.dat oraz trybów (rt) i (rb). Wyciągnąć

wnioski dotyczące zapisu i odczytu danych w trybie tekstowym i binarnym.

3.3 Opracować następujące funkcje obsługi plików znakowych:

a) zapisującą znaki wprowadzane z klawiatury do pliku o ustalonej nazwie w trybie

otwarcia binarnego; znaki wprowadzać za pomocą funkcji fputc; wprowadzanie

znaków

zakończyć po napotkaniu ESC; prototyp: PiszZn(FILE *f, char *nazwa);

background image

14

b) odczytującą zawartość pliku znak po znaku w trybie otwarcia binarnego i

wyprowadzającą znaki na ekran; wykorzystać funkcję fgetc; prototyp: CzytajZn(FILE

*f, char *nazwa);

c) wyznaczającą długość pliku w bajtach; wykorzystać funkcje fseek i ftell; prototyp:

long IleBP(FILE *f);

d) dopisującą znak na zadanej pozycji w pliku (znak powinien być wstawiony pomiędzy

istniejące znaki); prototyp: Dopisz(FILE *f; char *nazwa, long pozycja, int znak).

3.4 Wykorzystując funkcję fprintf zapisać do pliku dane typu int, char, float oraz daną

typu łańcuchowego w wybranym formacie (np. %5d%3c%8.2f%10s; dla danych 23, 'A',

234.57, "Ala_Ola" w pliku fizycznym zapisane zostaną ∇∇∇23∇∇A∇∇234.57∇∇∇

Ala_Ola). Odczytać wprowadzone dane za pomocą funkcji fscanf. Należy pamiętać, że

podczas odczytu, dla wszystkich formatów oprócz %c, przed zinterpretowaniem są

pomijane spacje. W celu pominięcia zbędnych spacji można wykorzystać format

%*[∇]%c.

3.5 Dana jest struktura typu struct tosoba { char naz[20]; unsigned wiek; long id; }.

Opracować

następujące funkcje:

a) zapisującą do pliku znakowego łańcuch ”-- ... --\n” złożony z 30 znaków ’-’ i jednego

znaku ’\n’, a następnie pola zmiennej strukturalnej tosoba w wybranym formacie

(np. dla fprintf: nazwisko - %20s\n, wiek - %6u\n, identyfikator - %10ld\n);

b) odczytującą z pliku łańcuch złożony z 30 znaków ’-’ i jednego znaku ’\n’, a następnie

pola struktury typu tosoba rozdzielone znakami przejścia do nowej linii (pominięcie

sekwencji ”-- ...--\n” o dowolnej długości można zrealizować za pomocą formatu

%*[-\n], który oznacza, że znaki ’-’ oraz ’\n’ są pomijane; czytanie rozpocznie się jeśli

pojawi się znak różny od [-\n]).

W programie głównym zapisać do pliku N struktur (N – stała), a następnie odczytać dane.

3.6 W pliku tekstowym p1.txt znajduje się K liczb całkowitych rozdzielonych spacjami i

posortowanych rosnąco. W pliku tekstowym p2.txt znajduje się N liczb całkowitych

background image

15

rozdzielonych spacjami i posortowanych rosnąco. Opracować funkcję, która realizuje

algorytm sortowania przez łączenie:

a) otwiera pliki p1.dat i p2.dat;

b) odczytuje pierwszą liczbę z pliku p1 i pliku p2;

c) porównuje odczytane liczby i mniejszą z nich zapisuje do pliku p3.dat;

d) powtarza operacje odczytu i porównywania danych, aż do wyczerpania

danych w obu plikach.

Na przykład dla plików p1 i p2, zawierających elementy 2, 4, 5, 7 (plik p1)

oraz 3, 6, 9 (plik p2), przedstawiona procedura tworzy plik p3, który zawiera

elementy 2, 3, 4, 5, 6, 7, 9.

3.7 Dany jest plik tekstowy zawierający liczby rzeczywiste typu double zapisane w formacie

z dwoma miejscami po przecinku i rozdzielone spacjami. Napisać program, który:

• zliczy liczbę danych w pliku, czytając dane z pliku aż do napotkania końca pliku lub

do pierwszego nieudanego odczytu;

• przewinie plik na początek;

• dokona dynamicznej alokacji tablicy typu double, która pomieści wszystkie dane z

pliku;

• wczyta dane z pliku do utworzonej tablicy;

• zamknie plik;

• wyprowadzi dane z tablicy na ekran.

Przed zakończeniem programu zwolnić zaalokowaną pamięć.

Pliki binarne

3.8 Wykorzystując funkcję fwrite zapisać do pliku binarnego daną typu char, int, long,

double oraz tablicę znaków. Odczytać dane z pliku za pomocą funkcji fread.

3.9 Zdefiniować typ tdana, np. typedef double tdana. Opracować program, który zapisze do

pliku binarnego dane w formacie: rozmiar danej typu tdana (zmienna typu unsigned),

liczba

danych w pliku (zmienna typu long), ciąg danych typu tdana zapisywanych do pliku, a

następnie odczyta dane z pliku i wyprowadzi na ekran.

background image

16

3.10 Opracować program, który na podstawie rozmiaru pliku binarnego określi ile zawiera

on liczb typu long, a następnie utworzy dynamiczną tablicę liczb typu long i wczyta do

niej zawartość pliku. Wyprowadzić zawartość tablicy na ekran. Przed zakończeniem

programu zwolnić przydzieloną pamięć. Uwaga: rozmiar pliku można określić za

pomocą funkcji ftell.

3.11 Zdefiniować typ strukturalny typedef struct tosoba { char naz[20]; long id; }.

Opracować następujące funkcje obsługujące plik złożony ze zmiennych strukturalnych

typu tosoba:

a) inicjującą zmienną typu tosoba losowymi wartościami;

prototyp: void Inicjuj(tosoba& r);

b) wyprowadzającą zawartość zmiennej typu tosoba na ekran;

c) wyprowadzającą zawartość zmiennej typu tosoba na ekran;

d) dopisującą zmienną typu tosoba na końcu pliku o podanej nazwie;

prototyp: void Fdopisz(FILE *f, char *nazwa, const tosoba *r);

e) odczytującą zmienną z zadanej pozycji w pliku o podanej nazwie i zapisującą

daną do r;

prototyp: void Fczytaj (FILE *f, char *nazwa, long poz, tosoba& r);

f) wstawiającą, pomiędzy istniejące dane, nową daną na zadanej pozycji w pliku o

podanej nazwie; prototyp: void Fwstaw (FILE *f, char *nazwa, long poz, const

tosoba *r);

g) usuwającą element z zadanej pozycji w pliku i zapisującą daną do r;

prototyp: void Fusun (FILE *f, char *nazwa, long poz, tosoba& r).

h) Przetestować opracowane funkcje w programie.

3.12 Opracować program, który umożliwia przeglądanie zawartości dowolnego pliku o

podanej nazwie. Zawartość pliku wyprowadzać wierszami po 16 bajtów w postaci

szesnastkowej

i obok te same dane w postaci znakowej. W przypadku napotkania znaku sterującego

(np. ’\n’, znaki o kodach ASCII mniejszych niż 32) wyprowadzić kropkę.

background image

17

4.

Proponowana literatura:

- Harvey M. Dietel, Paul J. Dietel, Arkana C++: programowanie, Wydawnictwo RM,

Warszawa, 1998,

- Nabajyoti Bakarati, Biblia Turbo C++, LT & P, Warszawa, 1993,

- P. J. Plauger, Biblioteka standardowa C++, WNT, Warszawa, 1997,

- Namir C. Shammas, Borland C++ 4 kurs na zderzenie: [najszybszy sposób nauki

programowania !]

, Intersoftland, Warszawa, 1995,

- Piotr Metzger, C++: pierwsze kroki, Helion, Gliwice, 1994,

- Jesse Liberty, C++: ksiega eksperta, Helion, Gliwice 1999,

- Tony L. Hansen, C++: zadania i odpowiedzi, WNT, Warszwa, 1994,

- Davis Stephen R., C++ dla opornych, Oficyna wydawnicza Read Me, Warszawa, 1995,

- Paul Snaith, C++ nie tylko dla orłów, Intersoftland, Warszawa, 2000,

- Adam Majczak, C++ w 48 godzin, Intersoftland, Warszawa, 1993,

- Tomasz Kopacz, Język C w praktyce: Turbo C i C++, Zakład Nauczania Informatyki

Mikom, Warszawa, 1993,

- Kisielewicz Jerzy, Język C w środowisku Borland C++, Oficyna wydawnicza Politechniki

Wrocławskiej, Wrocław, 1998,

- David Vandevoorde, Język C++; ćwiczenia i rozwiązania, WNT, Warszawa, 2001,

- Bjarne Stroustrup, Język C++, WNT, Warszawa 1994, 1995, 2000,

- Alan Neibauer, Języki C i C++: twój pierwszy program, Komputerowa Oficyna

Wydawnicza Help, Warszawa, 1995,

- Clovis L. Tondo, Bruce P. Lenug, Podstawy języka C++: ćwiczenia i rozwiązania, WNT,

Warszawa, 2001,

- Stanley B. Lippman, Podstawy języka C++, WNT, Warszawa, 1994, 1996, 2001,

- Adam Majczak, Praktyczne programowanie w C++, Intersoftland, Warszawa, 1996,

- Steven Holzner, Programowanie w Borland C++, Intersoftland, Warszawa, 1993,

- Andrzej Zalewski, Programowanie w językach C i C++ z wykorzystaniem pakietu

Borland C++, Wydawnictwo Nakom, Poznań, 1994, 1997, 1998,

- Paweł Chomicz, Robert Ulijasz, Programowanie w jezyku C i C++, Wydawnictwo PLJ,

Warszawa, 1992,

- Kris Jamsa, Wygraj z C++, Zakład Nauczania Informatyki Mikom, Warszawa, 1996,

- Conor Sexton, Język C++ to proste, Wydawnictwo RM, Warszawa, 2001,

background image

18

- Alan R. Neibauer, Języki C i C++. Twój pierwszy program, Komputerowa Oficyna

Wydawnicza HELP, Warszawa, 1995,

- Wiesław Porębski, Programowanie w języku C++, Komputerowa Oficyna Wydawnicza

HELP, Warszawa, 2001,

- Adam Majczak, C++ dla licealistów i studentów, Wydawnictwo Translator S.C. ,

Warszawa, 2003.


Wyszukiwarka

Podobne podstrony:
INF 10 PLAN INFORM
OCHR OS I MIENIA I INF J# 10 13
Inf 2 10
zima 07 08 INF 8 10
INF 10 PLAN INFORM
9,10 met przen inf hydr ,niżów wezbr def kryt charak
inf sts cw 10 03 12
inf.trans., wykłady 10.10.12, Infrastruktura - podstawowe urządzenia, budynki użyteczności publiczne
a Mat inf. dz.wykl 10 , 1 „Równowaga przeżywania"(EB=Experience Balance)
09 10 inf o praktykach, I rok, Praktyki!
Wykład 1 - 02.10.08, inf o ciś krwi w ukl tetniczym wędruje do baroreceptorów, w nich powstaje ta in
OCHR OS I MIENIA I INF J 10 13
inf trans , wykłady1 10 12
zal nr 10 inf gim 2008, informatyka
inf.trans., wykłady 17.10.12
zal nr 10 inf sp 2008, informatyka
inf.trans., wykłady 31.10.12
inf.trans., wykłady 24.10.12
10 Metody otrzymywania zwierzat transgenicznychid 10950 ppt

więcej podobnych podstron