ANSI C 5

ANSI C 5



8 ŚRODOWISKO SYSTEMU UNIX _Z-----

8.4    | Dostęp swobodny - funkcją Iseek

Operacje wejścia i wyjścia są zwykle sekwencyjne: każde wywołanie funkcji read lub write odnosi się do miejsca w pliku tuż za pozycją osiągniętą przy poprzedniej operacji. Niekiedy zachodzi jednak potrzeba czytania z pliku lub pisania do pliku w dowolnej kolejności. Poruszanie się po pliku bez czytania czy pisania danych umożliwia odwołanie systemowe Iseek:

long lseek(int fd, long offset, int origin);

Funkcja Iseek zmienia bieżącą pozycje pliku o deskryptorze fd na pozycję wskazaną przez argument offset (odstęp), którą oblicza się względem punktu odniesienia określonego przez argument origin. Kolejne czytanie lub pisanie rozpocznie się od tej właśnie pozycji. Wartością origin może być 0, 1 lub 2 oznaczające odpowiednio, że odstęp ma być mierzony względem początku, bieżącej pozycji lub końca pliku. Aby na przykład dopisać dane do pliku, należy - przed pisaniem - poszukać jego końca:

lseek(fd, OL, 2);

(Tak reaguje interpretator poleceń w systemie Unix na przełączenie przepływu danych » oraz tak realizuje się tryb dostępu do pliku "a” w funkcji fopen.)

Wywołanie

lseek(fd, OL, 0);

powoduje powrót do początku pliku („przewinięcie** pliku - od ang. rewind).

Zwróć uwagę na argument OL; można to także zapisać (long)0 albo po prostu 0, jeśli funkcję Iseek zadeklarowano poprawnie.

Mając do dyspozycji funkcję Iseek, możemy traktować pliki mniej więcej tak, jak wielkie tablice (kosztem czasu dostępu). Na przykład, następująca funkcja czyta dowolną liczbę bajtów z dowolnego miejsca pliku. Funkcja ta zwraca liczbę przeczytanych bajtów lub -1 po wykryciu błędu.

#include ,,syscalls.h,,

/* get: przeczytaj n bajtów od pozycji pos */ int get(int fd, long pos, char *buf, int n)

{

if (lseek(fd, pos, 0) >= 0) /* ustaw pozycję */ return read(fd, buf, n); else

return -1;

}

8 5 PRZYKŁAD - REALIZACJA FUNKCJI FOPEN I GETC___—

-pows-r^ed—by


Wartością zwracaną przez Iseek jest liczba typu long dla nowej pożyj -1 w przypadku wystąpienia błędu. Funkcja fseek z biblioteki standar* dobna do Iseek z tym, że jej pierwszym argumentem jest wskaźnik pliku (FILE *) oraz że w przypadku błędu zwracana wartość jest różna od zera.


Przykład - realizacja funkcji fopen i getc

Aby zilustrować współpracę niektórych z opisanych odwołań systemowych, pokażemy realizację dwóch funkcji z biblioteki standardowej: fopen i getc.

Przypominamy, że w bibliotece standardowej pliki są identyfikowane za pomocą wskaźników plików, a nie za pomocą deskryptorów. Wskaźnik pliku jest wskaźnikiem do struktury zawierającej różne informacje o pliku: wskaźnik do bufora, dzięki któremu można czytać z pliku dużymi porcjami, licznik znaków pozostałych w buforze, wskaźnik do pozycji następnego znaku w buforze, deskryptor pliku oraz kilka znaczników, które opisują rodzaj dostępu do pliku (czytanie/pisanie), stan programu (wystąpienie błędów) itp.

Struktura danych opisujących plik jest zdefiniowana w standardowym nagłówku <stdio.h>. Nagłówek ten musi być włączany (za pomocą #include) do każdego pliku źródłowego, w którym używa się funkcji z biblioteki standardowej realizujących operacje wejścia-wyjścia. Jest on również włączony w funkcjach z tej biblioteki. W podanym dalej wyciągu z typowego pliku <stdio.h> te nazwy, które z założenia są przeznaczone do użytku tylko dla funkcji bibliotecznych, rozpoczynają się znakiem podkreślenia (przez co zmniejsza się prawdopodobieństwo kolizji z nazwami w programie użytkownika). Tę konwencję stosują wszystkie podprogramy z biblioteki standardowej.

#define NULL    0

#define EOF    (-1)

#define BUFSIZ    1024

#define OPEN_MAX 20 /* maks. liczba jednocześnie otwartych plików */ typedef struct _iobuf {

/* liczba znaków w buforze */

/* pozycja następnego znaku */ /* położenie bufora */

/* sposób dostępu do pliku */

/* deskryptor pliku */


int ent; char *ptr; char *base; int flag; int fd;

} FILE;

extern FILE _iob[OPEN_MAX];

233


Wyszukiwarka

Podobne podstrony:
ANSI C 0 8 ŚRODOWISKO SYSTEMU UNIX Każde wywołanie funkcji readdir zwraca wskaźnik do informacji o
ANSI C 4 8 ŚRODOWISKO SYSTEMU UNIX_________ Funkcja creat zwraca deskryptor pliku, jeśli mogła utw
ANSI C 3 8 ŚRODOWISKO SYSTEMU UNIX___________ Funkcja morecore otrzymuje pamięć od systemu operacy
ANSI C 4 8 ŚRODOWISKO SYSTEMU UNIX___ Napisz funkcję calloc, korzystając z wywołań malloc lub trak
ANSI C 3 8 ŚRODOWISKO SYSTEMU UNIX -_-_---- BUFSIZ liczbę bajtów, które mają być wypisane przez wr
ANSI C 6 8 ŚRODOWISKO SYSTEMU UNIX #define stdin    (&_iob[0]) #define stdout
ANSI C 8 8 ŚRODOWISKO SYSTEMU UNIX , 6 PRZYKŁAD - WYPISYWANIE ZAWARTOŚCI SKOROWIDZÓW_ 1 Zilustruje
ANSI C 9 8 ŚRODOWISKO SYSTEMU UNIX_________ Teraz jesteśmy już gotowi do napisania programu fsize.
ANSI C 1 8 ŚRODOWISKO SYSTEMU UNIX_______ while (read(dp->fd, (char *) &dirbuf, sizeof(dirb
ANSI C 7 powered by Mi si ol 8 ŚRODOWISKO SYSTEMU UNIX______J kodu. W szczególności nasza funkcja
ANSI C 5 1 3 STEROWANIE (nieobowiązkowy + albo —). (W rozdziale 4 pokażemy funkcję atof, która wyk
Pakiet Octave najlepiej funkcjonuje w systemie Unix w tym oczywiście także pod Linux’em. W nim też n
j) elastyczne przypisywania dostępności poszczególnych funkcji systemu oraz konfiguracji GUI do użyt
ANSI C 5 4 FUNKCJE I STRUKTURA PROGRAMU_________^ Zmienna jest zewnętrzna, jeśli zdefiniowano ją n
ANSI C 5 6 STRUKTURY-----------— postępowanie polega najpierw na zadeklarowaniu malloc jako funkcj
kilka wersji UNIX (System III oraz System V) w celu konsolidacji środowisk rozwijających UNIX na poz

więcej podobnych podstron