oracular (3) fopen.3.gz

Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

       fopen, fdopen, freopen - funkcje otwarcia strumienia

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <stdio.h>

       FILE *fopen(const char *restrict pathname, const char *restrict mode);
       FILE *fdopen(int fd, const char *mode);
       FILE *freopen(const char *restrict pathname, const char *restrict mode,
                     FILE *restrict stream);

   Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

       fdopen():
           _POSIX_C_SOURCE

OPIS

       Funkcja fopen() otwiera plik, którego nazwę wskazuje pathname i wiąże z nim strumień.

       Argument  mode wskazuje na łańcuch rozpoczynający się jednym z poniższych ciągów (mogą po nich występować
       dodatkowe znaki, zgodnie z opisem poniżej):

       r      Otwarcie pliku tekstowego do odczytu. Strumień wskazuje początek pliku.

       r+     Otwarcie pliku do odczytu i zapisu. Strumień wskazuje początek pliku.

       w      Usunięcie zawartości pliku lub utworzenie nowego pliku tekstowego  do  zapisu.  Strumień  wskazuje
              początek pliku.

       w+     Otwarcie  do  odczytu  i  zapisu. Jeśli plik nie istnieje, zostaje utworzony, w przeciwnym wypadku
              jego zawartość zostaje usunięta. Strumień wskazuje początek pliku.

       a      Otwarcie do dopisywania (zapisu na końcu pliku).  Jeśli  plik  nie  istnieje,  zostaje  utworzony.
              Strumień wskazuje na koniec pliku.

       a+     Otwarcie  do  dopisywania  (zapisu  na  końcu  pliku). Jeśli plik nie istnieje, zostaje utworzony.
              Wyjście jest zawsze dopisywane na końcu pliku. POSIX milczy na temat początkowej pozycji  odczytu,
              przy  korzystaniu  z  tego trybu. W przypadku glibc, początkową pozycją pliku do odczytywania jest
              początek pliku, lecz Android/BSD/MacOS ustawiają początkową pozycję pliku do odczytywania na końcu
              pliku.

       Łańcuch  mode  może  także  zawierać  literę  „b”  zarówno jak ostatni znak jak też jako znak umieszczony
       pomiędzy znakami dowolnego dwuznakowego łańcucha opisanego powyżej. Służy to wyłącznie zgodności z ISO  C
       i  nie  powoduje  żadnego efektu, „b” jest ignorowane we wszystkich systemach zgodnych z POSIX, włączając
       Linuksa (inne systemy mogą różnie traktować pliki tekstowe i pliki binarne; dodanie „b” może  być  dobrym
       pomysłem,  jeśli  wykonywane  są  operacje  wejścia/wyjścia  dla  pliku  binarnego  a  przewidywane  jest
       przeniesienie programu do środowisk nieuniksowych).

       Więcej informacji o rozszerzeniach glibc dla mode zawarto w UWAGACH.

       Wszystkie pliki będą tworzone z uprawnieniami S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH  |  S_IWOTH
       (0666), zmodyfikowanymi przez wartość umask procesu (patrz umask(2)).

       Odczyt  i zapis może występować w strumieniu do zapisu/odczytu w dowolnej kolejności. Należy zauważyć, że
       ANSI C wymaga interwencji funkcji ustalającej  pozycję  pliku  pomiędzy  zapisem  i  odczytem,  chyba  że
       operacja  odczytu  napotka  koniec  pliku.  (Jeśli  ten warunek nie jest spełniony, operacja odczytu może
       zwrócić wynik innego zapisu niż ostatni.) Tak więc dobrą zasadą (i czasami konieczną pod  Linuksem)  jest
       wstawianie  funkcji  fseek(3) lub fsetpos(3) pomiędzy operacjami zapisu i odczytu na takim strumieniu. Ta
       operacja może być pozornym rozkazem pustym, no-op, (tak jak w fseek(..., 0L, SEEK_CUR) wywoływanym w celu
       wykorzystania ubocznych skutków synchronizujących.

       Otwarcie  pliku  w  trybie  dopisywania  (a  jako  pierwszy  znak mode) powoduje, że wszystkie późniejsze
       operacje zapisu do tego strumienia wystąpią na końcu pliku, tak jakby były poprzedzone wywołaniem

           fseek(stream, 0, SEEK_END);

       Deskryptor pliku związany ze strumieniem jest otwierany w taki  sposób,  jak  przy  wywołaniu  open(2)  z
       następującymi znacznikami:

              ┌─────────────┬───────────────────────────────┐
              │tryb fopen()znaczniki open()              │
              ├─────────────┼───────────────────────────────┤
              │     r       │ O_RDONLY                      │
              ├─────────────┼───────────────────────────────┤
              │     w       │ O_WRONLY | O_CREAT | O_TRUNC  │
              ├─────────────┼───────────────────────────────┤
              │     a       │ O_WRONLY | O_CREAT | O_APPEND │
              ├─────────────┼───────────────────────────────┤
              │     r+      │ O_RDWR                        │
              ├─────────────┼───────────────────────────────┤
              │     w+      │ O_RDWR | O_CREAT | O_TRUNC    │
              ├─────────────┼───────────────────────────────┤
              │     a+      │ O_RDWR | O_CREAT | O_APPEND   │
              └─────────────┴───────────────────────────────┘
   fdopen()
       Funkcja  fdopen()  wiąże  strumień z istniejącym deskryptorem pliku, fd. Łańcuch mode strumienia (jeden z
       „r”, „r+”, „w”, „w+”, „a”, „a+”) musi być zgodny z trybem  otwarcia  deskryptora  pliku.  Pozycja  nowego
       strumienia  jest  taka  sama,  jak  pozycja deskryptora fd, a znaczniki błędu i końca pliku są wyłączane.
       Tryby „w” oraz „w+” nie powodują usunięcia zawartości  pliku.  Deskryptor  pliku  nie  jest  powielany  i
       zostanie  zamknięty  w  chwili  zamknięcia  strumienia utworzonego za pomocą fdopen(). Rezultat wywołania
       funkcji fdopen() dla obiektu pamięci dzielonej jest niezdefiniowany.

   freopen()
       Funkcja freopen() otwiera plik, którego nazwa jest zawarta w łańcuchu wskazywanym przez pathname i  wiąże
       z  nim strumień wskazywany przez stream. Pierwotny strumień jest zamykany (jeśli istnieje). Argument mode
       ma takie samo znaczenie jak w przypadku funkcji fopen().

       Jeśli argument pathname jest wskaźnikiem pustym, freopen() zmienia tryb strumienia na  tryb  określony  w
       mode;  to  jest  freopen()  otwiera ponownie ścieżkę, która jest związana ze strumieniem. Określenie tego
       zachowania zostało dodane w standardzie C99, które opisuje go następująco:

              W takim przypadku, deskryptor  pliku  związany  ze  strumieniem  nie  musi  być  zamknięty,  jeśli
              wywołanie do freopen() powiedzie się. Od implementacji zależy, które zmiany trybów są dozwolone (o
              ile w ogóle) i w jakich okolicznościach.

       Podstawowym zastosowaniem funkcji freopen() jest  zmiana  pliku  związanym  ze  standardowym  strumieniem
       tekstowym (stderr, stdin lub stdout).

WARTOŚĆ ZWRACANA

       Jeśli  funkcja fopen(), fdopen() czy freopen() zakończy się pomyślnie, zwraca wskaźnik do struktury FILE.
       W przeciwnym wypadku zwraca NULL a zmiennej globalnej errno  nadawana  jest  wartość  określającą  rodzaj
       błędu.

BŁĘDY

       EINVAL Argument mode podany dla fopen(), fdopen() lub freopen() jest nieprawidłowy.

       Funkcje  fopen(), fdopen() i freopen() mogą także zakończyć się niepowodzeniem i ustawić wartość errno na
       dowolny błąd wymieniony w opisie funkcji malloc(3).

       Funkcja fopen() może także  zakończyć  się  niepowodzeniem  i  ustawić  wartość  errno  na  dowolny  błąd
       wymieniony w opisie funkcji open(2).

       Funkcja  fdopen()  może  także  zakończyć  się  niepowodzeniem  i  ustawić  wartość errno na dowolny błąd
       wymieniony w opisie funkcji fcntl(2).

       Funkcja freopen() może także zakończyć się  niepowodzeniem  i  ustawić  wartość  errno  na  dowolny  błąd
       wymieniony w opisie funkcji open(2), fclose(3) i fflush(3).

ATRYBUTY

       Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).

       ┌───────────────────────────────────────────────────────────────┬────────────────────────┬───────────────┐
       │InterfejsAtrybutWartość       │
       ├───────────────────────────────────────────────────────────────┼────────────────────────┼───────────────┤
       │fopen(), fdopen(), freopen()                                   │ Bezpieczeństwo wątkowe │ MT-bezpieczne │
       └───────────────────────────────────────────────────────────────┴────────────────────────┴───────────────┘

STANDARDY

       fopen()
       freopen()
              C11, POSIX.1-2008.

       fdopen()
              POSIX.1-2008.

HISTORIA

       fopen()
       freopen()
              POSIX.1-2001, C89.

       fdopen()
              POSIX.1-2001.

UWAGI

   Uwagi dla glibc
       Biblioteka GNU C umożliwia stosowanie następujących rozszerzeń dla łańcucha podanego w mode:

       c (od glibc 2.3.3)
              W przypadku operacji otwarcia lub kolejnych operacji odczytu i zapisu, nie robi punktów anulowania
              (cancellation point) wątku. Znacznik ten jest ignorowany w przypadku fdopen().

       e (od glibc 2.7)
              Otwiera plik ze znacznikiem O_CLOEXEC. Więcej informacji w podręczniku open(2). Znacznik ten  jest
              ignorowany w przypadku fdopen().

       m (od glibc 2.3)
              Próbuje  uzyskać  dostęp  do  pliku za pomocą mmap(2), zamiast wywołań systemowych wejścia/wyjścia
              (read(2), write(2)). Obecnie, próba korzystania z mmap(2) nastąpi tylko, gdy plik  jest  otwierany
              do odczytu.

       x      Otwiera  plik  na wyłączność (jak przy znaczniku O_EXCL open(2)). Jeśli plik już istnieje, fopen()
              zawodzi i ustawia errno na EEXIST. Znacznik ten jest ignorowany w przypadku fdopen().

       Oprócz powyższych znaków, fopen() i freopen() obsługują ponadto następującą składnię w mode:

        ,ccs=łańcuch

       Podany string jest przyjmowany jako nazwa zakodowanego zestawu znaków, a  strumień  jest  oznaczany  jako
       zorientowany  szeroko. Od tego momentu, wewnętrzna funkcje konwertujące przekształcają wejście/wyjście na
       i z zestawu znaków string. Jeśli nie użyje się składni ,ccs=string, to szerokie zorientowanie  strumienia
       jest  ustalane po pierwszej operacji na pliku. Jeśli operacja ta działa na szerokich znakach, to strumień
       jest oznaczany jako zorientowany szeroko i ładowane są funkcje służące do konwersji na zakodowany  zestaw
       znaków.

USTERKI

       Przy   przetwarzaniu   mode   pod  kątem  wyodrębnienia  poszczególnych  znaków  znaczników  (tj.  znaków
       poprzedzających określenie „ccs”), implementacja  glibc  fopen()  i  freopen()  ogranicza  liczbę  znaków
       sprawdzanych  w  mode  do  7  (lub,  przed  glibc  2.14, do 6, co nie było wystarczające do uwzględnienia
       możliwych określeń takich jak „rb+cmxe”). Bieżąca implementacja fdopen() sprawdza co najwyżej 5 znaków  w
       mode.

ZOBACZ TAKŻE

       open(2), fclose(3), fileno(3), fmemopen(3), fopencookie(3), open_memstream(3)

TŁUMACZENIE

       Autorami  polskiego  tłumaczenia  niniejszej  strony  podręcznika są: Adam Byrtek <alpha@irc.pl>, Andrzej
       Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje  o  warunkach  licencji  można  uzyskać
       zapoznając  się  z  GNU General Public License w wersji 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ lub
       nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej  ⟨manpages-pl-
       list@lists.sourceforge.net⟩.