Поблочный и побайтовый режимы управления файлами, страница 6

                if ((fp->flag & (_READ | _WRITE)) == 0)

                     break;        /* found free slot */

           if (fp >= _iob + OPEN_MAX)    /* no free slots */

                return NULL;

           if (*mode == 'w')

                fd = creat(name, PERMS);

           else if (*mode == 'a') {

                if ((fd = open(name, 0_WRONLY, 0)) == -1)

                     fd = creat (name, PERMS);

                lseek(fd, 0L, 2);

           } else

                fd = open (name, 0_RDONLY, 0);

           if (fd == -1)         /* couldn't access name */

                return NULL;

           fp->fd = fd;

           fp->cnt = 0;

           fp->base = NULL;

           fp->flag = (*mode = 'r') ? _READ : _WRITE;

           return fp;

      }

Эта версия FOPEN не управляет всеми стандартными возможностями управления файла.

В частности в ней не распознается тип файла BINARY и некоторые другие возможности. Цель этой программы проиллюстрировать достаточно глубокое использование примитивов файловой системы.

               VI.

Переназначение ввода-вывода. Каналы

      Средства Ввода и вывода - не часть языка непосредственно.

 Программы взаимодействуют с их средой в намного более

 сложным пути чем те мы показали прежде. В этой главе мы

 опишем стандартную библиотеку, набор функций, которые обеспечивают

 ввод и вывод.

      Традиционно C использует услуги операционной системы UNIX для

работы со вводом - выводом. Язык C имеет три способа системных вызовов:

      - Стандартный ввод - вывод;

      - Байтовый ввод - вывод;

      - Блочно-ориентированный ввод - вывод.

      В этой главе мы описываем эти три способа. Но стандартный Ввод - вывод мы

Пила выше и в этой главе это - повторение(копия) старого материала с

Некоторые новые подробности. Список параметров Переменной длины нов в этой части.

Свойства библиотечных функций определены в торцевых бортах <stdio.h>,

<Io.h>, <ctype.h>.

           8. Я. Стандартный ввод - вывод. 

     Стандартный Ввод - вывод имеет три специальных идентификация, чтобы описать режимы

Из работы:

      - Stdin - стандартная входная (клавиатура),

      - Stdout - стандартный вывод (экран),

      - Stderr - средние квадратические ошибки (также экран, но определять ошибки

                                 В во время выполнения).

Эти три идентификация мы может использовать непосредственно в байтовом и

Блочно-ориентированный Ввод - вывод для совместимости с общей(обычной) файловой системой. Но в них

Вариант это не необходим использовать операцию "открытый файл", потому что стандарт

Судебный архив открыт всегда в во время выполнения из программы.

           Простая модель текстового ввода и выхода. 

      Как мы сказали выше, библиотека осуществляет простую модель

 текстового ввода и вывода. Текстовый поток состоит из последовательности строк;

 Каждые концы строки снабжаются newline символом. Если система не оперирует

 этим путем, то библиотека должна выполнять необходимые преобразования.

 Например, библиотека могла бы конвертировать(преобразовывать) перевод каретки и

 перевод строки к newline на входе и назад снова на выходе.

      Самый простой входной механизм должен читать один символ одновременно

 со стандартного входа, обычно клавиатура, с GETCHAR:

           Int getchar ( )

 Getchar возвращает следующий входной символ, или EOF

 когда сталкивается с концом файла. Символическая константа EOF определена в

 <Stdio.h>. Значение обычно -1, но испытания должны быть написаны в

 виде EOF, чтобы независеть от специфической величины.

      Во многих средах, файл может быть заменен на клавиатуру

 Использование < соглашение для входного переназначения: если PROG использует программу

 GETCHAR, тогда командная строка

                Prog <infile>

 заставляет PROG читать символы от INFILE вместо этого. Переключение

 входа сделано таким способом, что сама PROG безразлична к

 замене; в частности файл " < infile " не включена в

 определение  командной строки в argv. Переключение Входа также невидимо если

 Вход исходит из другой программы через механизм канала: в UNIX

  командная строка

           Otherprog | prog

 выполняет эти две программы OTHERPROG и PROG, и стандартный вывод трубопроводов

 из otherprog переходит в стандартный вход для PROG.

      Функция

           Int putchar (int)

 используется для вывода: putchar (c) выводит символ "С" на

 вывод, который является по умолчанию экраном. Putchar возвращает введенный символ

  или EOF, если ошибка происходит. Снова, выход может обычно быть

 направленный к поименованному файла: если prog использует putchar,

           Prog > outfile

 запишет стандартный вывод к outfile вместо этого. Если каналы поддержаны,

           Prog | anotherprog

 Помещает стандартный вывод prog в стандартный вход anotherprog.

           В то время как ((C = getchar ())! = EOF)

                Putchar (tolower (c));

           Возвращение 0;

     }

      Функция tolower определена в <ctype.h>; это конвертирует(преобразовывает) верхний

 Символ случая к нижней наборной кассе строчных литер, и возвращениям другие нетронутые(равнодушные) символы. Как

 Мы упомянули ранее, "функции" подобно getchar и putchar в <stdio.h>

 И tolower в <ctype.h> - часто макрокоманды, таким образом избегая верхнего

 Из обращения к функции в символ.

     Точно также можно записать информацию в уже существующий файл,

если знак ">" заме6ить на знак ">>". Можно вывести в файл сообщение об