fopen

FOPEN(3)        Ð ÑководÑÑво пÑогÑаммиÑÑа Linux        FOPEN(3)



ÐÐЯ
       fopen, fdopen, freopen - ÑÑнкÑии Ð´Ð»Ñ Ð¾ÑкÑÑÑÐ¸Ñ Ð¿Ð¾Ñоков

ÐÐÐÐÐ
       #include <stdio.h>

       FILE *fopen(const char *path, const char *mode);

       FILE *fdopen(int fd, const char *mode);

       FILE *freopen(const char *path, const char *mode, FILE *stream);

   ТÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°ÐºÑоÑа ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑвойÑÑв Ð´Ð»Ñ glibc
   (Ñм. feature_test_macros(7)):

       fdopen(): _POSIX_C_SOURCE

ÐÐÐСÐÐÐÐ
       ФÑнкÑÐ¸Ñ fopen() оÑкÑÑÐ²Ð°ÐµÑ Ñайл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼, коÑоÑое
       задано в виде ÑÑÑоки в path, и ÑвÑзÑÐ²Ð°ÐµÑ ÐµÐ³Ð¾ Ñ
       поÑоком.

       ÐаÑамеÑÑ mode ÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑÑÑокÑ, наÑинаÑÑÑÑÑÑ Ñ
       одной из ÑледÑÑÑÐ¸Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑей (за
       ними могÑÑ ÑледоваÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе
       ÑимволÑ, опиÑаннÑе далее):

       r      ÐÑкÑÑÑÑ ÑекÑÑовÑй Ñайл Ð´Ð»Ñ ÑÑениÑ. ÐоÑок
              ÑовмеÑаеÑÑÑ Ñ Ð½Ð°Ñалом Ñайла.

       r+     ÐÑкÑÑÑÑ Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð¸ запиÑи. ÐоÑок
              ÑовмеÑаеÑÑÑ Ñ Ð½Ð°Ñалом Ñайла.

       w      ÐбÑезаÑÑ Ñайл до нÑлевой Ð´Ð»Ð¸Ð½Ñ Ð¸Ð»Ð¸
              ÑоздаÑÑ ÑекÑÑовÑй Ñайл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи. ÐоÑок
              ÑовмеÑаеÑÑÑ Ñ Ð½Ð°Ñалом Ñайла.

       w+     ÐÑкÑÑÑÑ Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð¸ запиÑи. Файл ÑоздаÑÑÑÑ,
              еÑли его не ÑÑÑеÑÑвÑеÑ, в пÑоÑивном ÑлÑÑае
              он обÑезаеÑÑÑ. ÐоÑок ÑовмеÑаеÑÑÑ Ñ
              наÑалом Ñайла.

       a      ÐÑкÑÑÑÑ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (запиÑи в конеÑ
              Ñайла). Файл ÑоздаÑÑÑÑ, еÑли его не
              ÑÑÑеÑÑвÑеÑ. ÐоÑок ÑовмеÑаеÑÑÑ Ñ ÐºÐ¾Ð½Ñом
              Ñайла.

       a+     ÐÑкÑÑÑÑ Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð¸ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (запиÑи в
              ÐºÐ¾Ð½ÐµÑ Ñайла). Файл ÑоздаÑÑÑÑ, еÑли не
              ÑÑÑеÑÑвÑеÑ. ÐаÑалÑное положение в Ñайле
              Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ ÑÑÑанавливаеÑÑÑ Ð² наÑало
              Ñайла, но вÑвод вÑегда добавлÑеÑÑÑ Ð²
              ÐºÐ¾Ð½ÐµÑ Ñайла.

       СÑÑока mode Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑодеÑжаÑÑ Ñимвол «b» в
       каÑеÑÑве поÑледнего Ñимвола или Ñимвола
       Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ Ñимволами в лÑбÑÑ Ð¾Ð¿Ð¸ÑаннÑÑ Ð²ÑÑе
       двÑÑÑимволÑнÑÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°ÑиÑÑ. ÐÑо ÑÑебÑеÑÑÑ
       ÑолÑко Ð´Ð»Ñ ÑовмеÑÑимоÑÑи Ñ C89 и не оказÑваеÑ
       никакого влиÑниÑ; Ñимвол «b» игноÑиÑÑеÑÑÑ
       во вÑÐµÑ POSIX-ÑовмеÑÑимÑÑ ÑиÑÑемаÑ, вклÑÑÐ°Ñ Linux.
       ÐÑÑгие ÑиÑÑÐµÐ¼Ñ Ð¼Ð¾Ð³ÑÑ Ð¿Ð¾-ÑÐ°Ð·Ð½Ð¾Ð¼Ñ Ð¾Ð±ÑаÑаÑÑÑÑ Ñ
       ÑекÑÑовÑми и двоиÑнÑми Ñайлами, и
       добавление «b» Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм,
       еÑли Ð²Ñ Ð¾ÑÑÑеÑÑвлÑеÑе ввод-вÑвод в двоиÑнÑй
       Ñайл и ожидаеÑе, ÑÑо ваÑа пÑогÑамма можеÑ
       бÑÑÑ Ð¿ÐµÑенеÑена в не UNIX окÑÑжение.

       РимеÑÑиÑÑÑ ÑаÑÑиÑениÑÑ mode в glibc ÑмоÑÑиÑе ÐÐÐÐЧÐÐÐЯ
       далее.

       ÐÑбой ÑозданнÑй Ñайл бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð°ÑÑибÑÑÑ S_IRUSR
       | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666), как
       изменÑннÑе в ÑооÑвеÑÑÑвии Ñо знаÑением umask
       пÑоÑеÑÑа (ÑмоÑÑиÑе umask(2)).

       ЧÑение и запиÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿ÐµÑемеÑиваÑÑÑÑ Ð´ÑÑг Ñ
       дÑÑгом в поÑоке, оÑкÑÑÑом Ð´Ð»Ñ ÑÑениÑ/запиÑи, в
       лÑбом поÑÑдке). ÐамеÑим, ÑÑо в ANSI C ÑÑебÑеÑÑÑ,
       ÑÑÐ¾Ð±Ñ Ð¼ÐµÐ¶Ð´Ñ Ð²Ñводом и вводом
       иÑполÑзовалиÑÑ ÑÑнкÑии позиÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²
       Ñайле, еÑли опеÑаÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° не вÑÑÑеÑила
       ÐºÐ¾Ð½ÐµÑ Ñайла. ÐÑли ÑÑо ÑÑловие не вÑполнÑеÑÑÑ,
       Ñо пÑи ÑÑении ÑазÑеÑаеÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÑезÑлÑÑаÑ,
       не ÑовпадаÑÑий Ñ Ð´Ð°Ð½Ð½Ñми Ñамой поÑледней
       запиÑи. ÐоÑÑÐ¾Ð¼Ñ ÑекомендÑеÑÑÑ (а иногда и
       дейÑÑвиÑелÑно необÑодимо в Linux)
       иÑполÑзоваÑÑ ÑÑнкÑии fseek(3) или fgetpos(3) междÑ
       опеÑаÑиÑми ÑÑÐµÐ½Ð¸Ñ Ð¸ запиÑи в одном поÑоке.
       ÐÑи опеÑаÑии могÑÑ ÑакÑиÑеÑки бÑÑÑ Ð¿ÑÑÑÑми
       (напÑимеÑ, fseek(..., 0L, SEEK_CUR), вÑÐ·Ð²Ð°Ð½Ð½Ð°Ñ Ð´Ð»Ñ
       Ñого, ÑÑÐ¾Ð±Ñ Ð²Ð¾Ð·Ð½Ð¸Ðº ÐµÑ Ð¿Ð¾Ð±Ð¾ÑнÑй ÑÑÑекÑ
       ÑинÑÑонизаÑии).

       ÐÑкÑÑÑие Ñайла в Ñежиме допиÑÑÐ²Ð°Ð½Ð¸Ñ (a в
       каÑеÑÑве пеÑвого Ñимвола mode) пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº
       ÑомÑ, ÑÑо вÑе поÑледÑÑÑие опеÑаÑии запиÑи в
       ÑÑÐ¾Ñ Ð¿Ð¾Ñок пÑоизводÑÑÑÑ Ð² ÐºÐ¾Ð½ÐµÑ Ñайла, как
       еÑли Ð±Ñ Ð¿ÐµÑед ними бÑла вÑзвана:

           fseek(stream, 0, SEEK_END);

       ФÑнкÑÐ¸Ñ fdopen() ÑвÑзÑÐ²Ð°ÐµÑ Ð¿Ð¾Ñок Ñ ÑÑÑеÑÑвÑÑÑим
       деÑкÑипÑоÑом Ñайла fd. Режим mode поÑока
       (одно из ÑледÑÑÑÐ¸Ñ Ð·Ð½Ð°Ñений: «r», «r+», «w»,
       ,w+», «a», «a+») должен бÑÑÑ ÑовмеÑÑим Ñ
       Ñежимом деÑкÑипÑоÑа Ñайла. УказаÑелÑ
       Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² Ñайле в новом поÑоке
       пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð½Ð°Ñение, Ñавное знаÑÐµÐ½Ð¸Ñ Ñ fd, а
       ÑказаÑели оÑибок и конÑа Ñайла оÑиÑаÑÑÑÑ.
       Ð ÐµÐ¶Ð¸Ð¼Ñ Â«w» или «w+» не обÑезаÑÑ Ñайл. ÐÑи ÑÑом
       не делаеÑÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð´ÐµÑкÑипÑоÑа Ñайла и он
       бÑÐ´ÐµÑ Ð·Ð°ÐºÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно Ñ Ð·Ð°ÐºÑÑÑием
       поÑока, Ñозданного fdopen(). РезÑлÑÑаÑ
       пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ fdopen() к обÑÐµÐ¼Ñ Ð¾Ð±ÑекÑÑ Ð¿Ð°Ð¼ÑÑи не
       опÑеделÑн.

       ФÑнкÑÐ¸Ñ freopen() оÑкÑÑÐ²Ð°ÐµÑ Ñайл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ path и
       ÑвÑзÑÐ²Ð°ÐµÑ ÐµÐ³Ð¾ Ñ Ð¿Ð¾Ñоком stream. ÐÑÑоднÑй поÑок
       (еÑли Ñакой ÑÑÑеÑÑвовал) закÑÑваеÑÑÑ. ÐнаÑение
       паÑамеÑÑа mode Ñакое же как Ñ ÑÑнкÑии fopen().
       ÐÑновной задаÑей ÑÑнкÑии freopen() ÑвлÑеÑÑÑ
       Ñмена Ñайла, ÑвÑзанного Ñо ÑÑандаÑÑнÑм
       ÑекÑÑовÑм поÑоком (stderr, stdin или stdout).

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи ÑÑпеÑном вÑполнении fopen(), fdopen() и freopen()
       возвÑаÑаеÑÑÑ ÑказаÑÐµÐ»Ñ FILE. РпÑоÑивном ÑлÑÑае
       возвÑаÑаеÑÑÑ NULL и errno пÑиÑваиваеÑÑÑ ÐºÐ¾Ð´
       оÑибки.

ÐШÐÐÐÐ
       EINVAL ÐеÑедано невеÑное знаÑение mode в fopen(),
              fdopen() или freopen().

       ФÑнкÑии fopen(), fdopen() и freopen() могÑÑ Ñакже
       завеÑÑаÑÑÑÑ Ñ Ð¾Ñибками и ÑÑÑанавливаÑÑ
       знаÑение errno ÑавнÑм какомÑ-либо знаÑениÑ
       из опÑеделÑннÑÑ Ð² malloc(3).

       ФÑнкÑÐ¸Ñ fopen() пÑи оÑÐ¸Ð±ÐºÐ°Ñ ÑÑÑанавливаеÑ
       знаÑение errno ÑавнÑм какомÑ-либо знаÑениÑ
       из опÑеделÑннÑÑ Ð² open(2).

       ФÑнкÑÐ¸Ñ fdopen() пÑи оÑÐ¸Ð±ÐºÐ°Ñ ÑÑÑанавливаеÑ
       знаÑение errno ÑавнÑм какомÑ-либо знаÑениÑ
       из опÑеделÑннÑÑ Ð² fcntl(2).

       ФÑнкÑÐ¸Ñ freopen() пÑи оÑÐ¸Ð±ÐºÐ°Ñ ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ errno
       ÑавнÑм какомÑ-либо знаÑÐµÐ½Ð¸Ñ Ð¸Ð·
       опÑеделÑннÑÑ Ð² open(2), fclose(3) и fflush(3).

ÐТРÐÐУТЫ
       ÐпиÑание ÑеÑминов данного Ñаздела ÑмоÑÑиÑе
       в attributes(7).

       ┌─────────────────────────────┬────────────────────────────────┬────────────────┐
       │ÐнÑеÑÑÐµÐ¹Ñ                ÐÑÑибÑÑ                      ÐнаÑение │
       ├─────────────────────────────┼────────────────────────────────┼────────────────┤
       │fopen(), fdopen(), freopen() │ ÐезвÑедноÑÑÑ Ð² ниÑÑÑ │ MT-Safe        │
       └─────────────────────────────┴────────────────────────────────┴────────────────┘
СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       fopen(), freopen(): POSIX.1-2001, POSIX.1-2008, C89, C99.

       fdopen(): POSIX.1-2001, POSIX.1-2008.

ÐÐÐÐЧÐÐÐЯ
   ÐамеÑÐ°Ð½Ð¸Ñ Ð¿Ð¾ glibc
       ÐиблиоÑека GNU C пÑедоÑÑавлÑÐµÑ ÑледÑÑÑие
       ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑÑÑоки в mode:

       c (наÑÐ¸Ð½Ð°Ñ Ñ glibc 2.3.3)
              Ðе вÑполнÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð¾ÑкÑÑÑиÑ, поÑледÑÑÑие
              ÑÑение и запиÑÑ, ÑоÑки оÑÐ¼ÐµÐ½Ñ Ð½Ð¸Ñи (thread
              cancellation points). ÐÑÐ¾Ñ Ñлаг игноÑиÑÑеÑÑÑ Ð´Ð»Ñ
              fdopen().

       e (наÑÐ¸Ð½Ð°Ñ Ñ glibc 2.7)
              ÐÑкÑÑÑÑ Ñайл Ñ Ñлагом O_CLOEXEC. ÐодÑобноÑÑи
              ÑмоÑÑиÑе в open(2). ÐÑÐ¾Ñ Ñлаг игноÑиÑÑеÑÑÑ Ð´Ð»Ñ
              fdopen().

       m (наÑÐ¸Ð½Ð°Ñ Ñ glibc 2.3)
              ÐÑÑаÑÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑÐ°Ð¹Ð»Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
              mmap(2), а не Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑиÑÑемнÑÑ Ð¾Ð¿ÐµÑаÑий
              ввода-вÑвода (read(2), write(2)). РнаÑÑоÑÑее
              вÑÐµÐ¼Ñ mmap(2) иÑполÑзÑеÑÑÑ ÑолÑко Ð´Ð»Ñ Ñайла,
              оÑкÑÑÑого на ÑÑение.

       x      ÐÑкÑÑÑÑ Ñайл в монополÑном Ñежиме (как Ñ
              Ñлагом O_EXCL Ñ open(2)). ÐÑли Ñайл Ñже
              ÑÑÑеÑÑвÑеÑ, Ñо fopen() завеÑÑаеÑÑÑ Ñ Ð¾Ñибкой и
              ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð·Ð½Ð°Ñение errno Ñавное EEXIST.
              ÐÑÐ¾Ñ Ñлаг игноÑиÑÑеÑÑÑ Ð´Ð»Ñ fdopen().

       Рдополнении к ÑÑим Ñимволам, Ð´Ð»Ñ fopen() и
       freopen() поддеÑживаеÑÑÑ ÑледÑÑÑий ÑинÑакÑÐ¸Ñ Ð²
       mode:

        ,ccs=ÑÑÑока

       ÐеÑÐµÐ´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ ÑÑÑока иÑполÑзÑеÑÑÑ ÐºÐ°Ðº имÑ
       набоÑа Ñимволов и поÑок помеÑаеÑÑÑ ÐºÐ°Ðº
       ÑиÑокоÑимволÑнÑй. С Ñого моменÑа внÑÑÑенние
       ÑÑнкÑии пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÐµÑекодиÑÑÑÑ Ð´Ð°Ð½Ð½Ñе
       ввода-вÑвода в ÑооÑвеÑÑÑвии Ñ Ð½Ð°Ð±Ð¾Ñом
       Ñимволов Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑÑÑока. ÐÑли ÑинÑакÑиÑ
       ,ccs=ÑÑÑока не Ñказан, Ñо ÑиÑокоÑимволÑноÑÑÑ
       поÑока опÑеделÑеÑÑÑ Ð¿Ð¾ пеÑвой Ñайловой
       опеÑаÑии. ÐÑли ÑÑо опеÑаÑÐ¸Ñ ÑвлÑеÑÑÑ
       ÑиÑокоÑимволÑной, Ñо поÑок помеÑаеÑÑÑ ÐºÐ°Ðº
       ÑиÑокоÑимволÑнÑй и загÑÑжаÑÑÑÑ ÑÑнкÑии длÑ
       пеÑекодиÑовки.

ÐÐФÐÐТЫ
       ÐÑи анализе оÑделÑнÑÑ Ñлагов в mode (Ñ. е.,
       Ñимволов пеÑед «ccs») ÑеализаÑÐ¸Ñ glibc длÑ
       fopen() и freopen() огÑаниÑÐ¸Ð²Ð°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво
       обÑабаÑÑваемÑÑ Ð² mode Ñимволов 7-Ñ (или, в glibc
       до веÑÑии 2.14, 6-Ñ, ÑÑо бÑло недоÑÑаÑоÑно длÑ
       вклÑÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½ÑÑ Ñлагов, напÑимеÑ
       «rb+cmxe»). ТекÑÑÐ°Ñ ÑеализаÑÐ¸Ñ fdopen()
       анализиÑÑÐµÑ Ð² mode не более 5 Ñимволов.

СÐÐТРÐТРТÐÐÐÐ
       open(2), fclose(3), fileno(3), fmemopen(3), fopencookie(3),
       open_memstream(3)



GNU                               2016-03-15                          FOPEN(3)