Operacje na plikach



Pobieranie 26,76 Kb.
Data26.03.2018
Rozmiar26,76 Kb.

OPERACJE NA PLIKACH
Pojęcie strumienia

Strumień jest źródłem lub celem danych i może być skojarzony z dyskiem lub innym urządzeniem zewnętrznym. Biblioteka standardowa obsługuje strumienie tekstowe i binarne, jakkolwiek w niektórych systemach operacyjnych a w szczególności w systemie Unix są one identyczne. Strumień tekstowy jest ciągiem wierszy; każdy wiersz zawiera zero lub więcej znaków i kończy się znakiem ‘\n’. W pewnych środowiskach programów (np. w DOS-ie) strumienie tekstowe mogą wymagać przekształcenia do innej postaci (np. przez zastąpienie każdego znaku ’\n’ parą znaków CR-LF tzn. znakami powrotu karetki i nowego wiersza). W takich implementacjach należy rozróżniać pliki tekstowe i binarne otwierając pliki tekstowe ze wskazaniem t, a pliki binarne – ze wskazaniem b.

Strumień binarny jest ciągiem nie przetworzonych bajtów reprezentującym wewnętrzne dane programu.

Gdy program rozpoczyna działanie, trzy strumienie są już otwarte: stdin (standardowe wejście), stdout (standardowe wyjście), i stderr (standardowe wyjście błędów).


Przechowywanie wyników działania programu w sposób trwały po zakończeniu działania programu, wprowadzanie danych do programu z zewnętrznego zbioru, tworzenie i obsługa baz danych – to sytuacje, w których należy się w programie posłużyć plikami.

Przetwarzanie pliku wymaga:



  • zadeklarowania wskaźnika pliku,

  • powiązania nazwy pliku w programie z nazwą zewnętrznego zbioru danych (np. pliku dyskowego)

  • otwarcia pliku w odpowiednim trybie (do czytania, pisania lub dopisywania)

  • wykonania operacji na pliku

  • zamknięcia pliku


Deklaracja wskaźnika pliku
FILE *nazwa_wskaźnika;
na przykład: FILE *plik; //plik jest wskaźnikiem do struktury typu FILE
Wskaźnik pliku pokazuje na strukturę typu FILE, zadeklarowaną w nagłówku . Struktura ta zawiera różne informacje o pliku: położenie bufora, bieżąca pozycja znaku w buforze, rodzaj dostępu do pliku (czytanie, pisanie itp.), sygnały o wystąpieniu błędów lub napotkaniu końca pliku. Użytkownik nie musi jednak wnikać w te szczegóły.

Operacja otwarcia pliku


FILE *fopen (const char *filename, const char mode)

Parametr filename oznacza nazwę otwieranego pliku, natomiast parametr mode - tryb jego otwarcia (rodzaj dostępu do pliku). Funkcja zwraca wskaźnik do pliku, a dokładniej wskaźnik do struktury typu FILE, w której gromadzone są wszystkie niezbędne informacje do jego obsługi. Jeśli próba otwarcia nie powiedzie się, funkcja zwraca wartość NULL.

Dostępne tryby otwarcia pliku:



  • ”r” – otwarcie pliku do czytania,

  • ”w” – otwarcie pliku do pisania; jeśli plik już istnieje kasowana jest jego poprzednia zawartość,

  • ”a” – otwarcie pliku do dopisywania na końcu pliku,

  • ”r+” - otwarcie pliku do aktualizacji (tj. czytania i pisania),

  • ”w+” - utworzenie pliku do aktualizacji; poprzednia zawartość pliku jest kasowana jeśli plik istnieje,

  • ”a+” - otwarcie lub utworzenie pliku do aktualizacji z dopisywaniem na końcu pliku.

W środowiskach programowych, w których rozróżniane są pliki tekstowe i binarne, pliki tekstowe otwierane są ze wskazaniem t, a binarne ze wskazaniem b. Stąd dostępne tryby otwarcia są następujące:



  • ”rt” – otwarcie pliku tekstowego do czytania,

  • ”rb” – otwarcie pliku binarnego do czytania,

  • ”wt” – otwarcie pliku tekstowego do pisania; jeśli plik już istnieje kasowana jest jego poprzednia zawartość,

  • ”wb” – otwarcie pliku binarnego do pisania; jeśli plik już istnieje kasowana jest jego poprzednia zawartość,

  • ”r+t” - otwarcie pliku tekstowego do aktualizacji (tj. czytania i pisania),

  • ”r+b” - otwarcie pliku binarnego do aktualizacji (tj. czytania i pisania),

  • ”w+t” - utworzenie pliku tekstowego do aktualizacji; poprzednia zawartość pliku jest kasowana jeśli plik istnieje,

  • ”w+b” - utworzenie pliku tekstowego do aktualizacji; poprzednia zawartość pliku jest kasowana jeśli plik istnieje.



Przykład 1


FILE *plik;

plik = fopen(”dane.dat”, ”wb”);
Powyższe zapisy spowodują otwarcie pliku binarnego o nazwie dane.dat do zapisu. Plik ten powstanie w bieżącym katalogu bieżącego dysku. Jeśli taki plik już wcześniej istniał, to jego zawartość zostanie skasowana. W obu przypadkach nowy plik jest pusty.

Przykład 2

FILE *we;

we = fopen(”lista.dat”, ”rt”);
Powyższa instrukcja fopen powoduje otwarcie pliku tekstowego o nazwie lista.dat do czytania. Plik ten będzie szukany w bieżącym katalogu domyślnego dysku. W przypadku próby otwierania do czytania nie istniejącego pliku wystąpi błąd.

Instrukcje zapisu do pliku





  • int fprintf (FILE *stream, const char *format, ...)

Funkcja fprintf , pod kontrolą argumentu format przekształca i wypisuje pozostałe argumenty do strumienia (pliku) stream. Wartość zwracana przez funkcję jest równa liczbie wypisanych znaków lub jest liczbą ujemną w przypadku błędu.



Przykład 3


FILE *plik1;

int a = 100; b = 200;

plik1 = fopen(”liczby.dat” , ”w”);

if (plik1 = = NULL)

{

printf(”Blad otwarcia pliku”);



exit(-1); //zakończenie programu

}

fprintf (plik1, ”%d %d ”, a, b);


Powyższa sekwencja instrukcji powoduje zapis do pliku dwóch liczb całkowitych dziesiętnych, które są wartościami zmiennych a i b.


  • int fputc (int c, FILE *stream)

Funkcja fputc wpisuje znak (przekształcony do unsigned char) do strumienia (pliku) stream. Zwraca wypisany znak lub EOF w przypadku błędu.

Przykład 4


FILE *znaki;

char zn;


if ((znaki = fopen(”znaki.dat” , ”wt”)) = = NULL))

{

printf(”Blad otwarcia pliku”);



exit(-1); //zakończenie programu

}

//zapis do pliku znaki.dat małych liter



for( zn = ‘a’; zn <= ‘z’; zn++)

fputc (zn, znaki);


Do pliku tekstowego znaki.dat zostaną wpisane wszystkie małe litery alfabetu łacińskiego.


  • int fputs( const char *s, FILE *stream)

Funkcja fputs wypisuje tekst zawarty w tablicy s (nie musi zawierać ‘\n’) do strumienia (pliku) stream. Zwraca liczbę nieujemną lub EOF w przypadku błędu.

Przykład 5

char *miasto = ”Kalisz”;

fputs(miasto, znaki);
Instrukcja fputs zapisuje do pliku z przykładu 4 tekst przechowywany w tablicy o nazwie miasto.



  • int fwrite (adres_obiektu, rozmiar_obiektu, liczba_obiektów, plik)

Funkcja fwrite ma cztery argumenty:

  • adres zmiennej, której wartość zapisywana jest do pliku,

  • rozmiar w bajtach zapisywanej danej, obliczany najczęściej z użyciem operatora sizeof,

  • liczba zapisywanych obiektów tego rodzaju,

  • adres struktury opisującej plik.

Funkcja zwraca liczbę wypisanych do pliku obiektów.




Instrukcje czytania z pliku





  • int fscanf (FILE *stream, const char *format, ...)

Funkcja fscanf czyta strumień (plik) stream i pod kontrolą argumentu format przypisuje przekształcone wartości kolejnym argumentom. Każdy z tych argumentów musi być wskaźnikiem. Funkcja kończy działanie, gdy zinterpretuje cały format. Funkcja zwraca EOF, jeśli przed jakimkolwiek przekształceniem napotka koniec pliku lub nastąpi jakiś błąd. W przeciwnym razie zwraca liczbę przekształconych i przypisanych danych wejściowych.



Przykład 6

FILE *plik1;

int a, b;

plik1 = fopen(”liczby.dat” , ”rb”);

if (plik1 = = NULL)

{

printf(”Blad otwarcia pliku”);



exit(-1); //zakończenie programu

}

fscanf (plik1, ”%d %d ”, &a, &b);


Z pliku plik1 założonego w przykładzie 3 zostaną odczytane dwie liczby całkowite dziesiętne, a ich wartości będą przypisane zmiennym o nazwach a i b.


  • int fgetc (FILE *stream)

Funkcja czyta ze strumienia (pliku) stream następny znak i zwraca jego wartość potraktowaną jako unsigned char (i przekształconą do int). W przypadku napotkania końca pliku albo wystąpienia błędu funkcja zwraca EOF.



Przykład 7

FILE *znaki;

char zn;

if ((znaki = fopen(”znaki.dat” , ”rt”)) = = NULL))

{

printf(”Blad otwarcia pliku”);



exit(-1); //zakończenie programu

}

// odczytanie zawartości pliku znaki.dat



while (zn = fgetc(znaki), !feof (znaki)) // zastosowano operator przecinkowy

putchar(zn);



Uwaga !


Funkcja
int feof(FILE *stream)
zwraca wartość niezerową (prawda)gdy został osiągnięty koniec pliku stream, a wartość zero (fałsz) w przypadku nie osiągnięcia końca pliku.


  • int fgets( char *s, int n, FILE *stream)

Funkcja fgets czyta co najwyżej n-1 znaków z pliku stream i wstawia do tablicy s. Funkcja przerywa czytanie po napotkaniu znaku nowego wiersza; znak ten także wstawia do tablicy. Cały tekst jest zakończony znakiem ‘\0’. Funkcja zwraca s lub NULL w przypadku napotkania końca pliku albo błędu.



  • int fread (adres_obiektu, rozmiar_obiektu, liczba_obiektów, plik)

Funkcja fread podobnie jak fwrite ma cztery argumenty:



  • adres zmiennej, której przypisana zostanie wartość odczytana z pliku,

  • rozmiar w bajtach odczytywanej danej, obliczany najczęściej z użyciem operatora sizeof,

  • liczba odczytywanych obiektów tego rodzaju,

  • adres struktury opisującej plik.


Operacja zamknięcia pliku

int fclose (FILE *stream)


Funkcja fclose zamyka otwarty wcześniej plik. Funkcja zwraca wartość EOF w przypadku jakiegoś błędu, a zero w pozostałych przypadkach.

Funkcje wyznaczające pozycję pliku



fseek
ftell



©operacji.org 2017
wyślij wiadomość

    Strona główna