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

                putc ( c , iop );

           return ferror (iop) ? EOF : 0;

      }

Стандарт определяет, что ferror() возвращает отличные от нуля значения для ошибки; fputs возвращает EOF для ошибки и неотрицательное значение иначе.

Легко определить длину строки getline с помощью fgets:

      /* getline: read a line, return length */

      int getline (char *line, int max)

      {   if (fgets(line, max, STDIN) == NULL)

                return 0;

           else

                return strlen (line);

      }

5.I.4. Функции для установки в файле.

Функция для установки индикатора положения(позиции) файла на начало:

           void rewind (fp);

Эта функция устанавливает файл, c описателем fp на начало.

Чтение и запись блоков данных:

        unsigned fread (void *buf, int bytes, int num, FILE *fp);

        unsigned fwrite (void *buf, int bytes, int num, FILE *fp);

Где buf - буфер, где мы помещаем / берем информацию.

           bytes - длина одного входа в байтах.

           Num - количество вхождений в буфере.

Это последовательный ввод и вывод. Когда необходимо, однако, файл может читаться или записываться в любом произвольном порядке. Запрос системы fseek обеспечивает способ двигаться вокруг в файле, чтобы читать или писать любые данные:

int fseek (FILE *fp, long nbytes, int origin);

Где nbytes - номер позиции в байтах, а индикатор в файле принимается относительно местоположения, указанного в origin:

SEEK_SET 0 - относительно начала файла,

SEEK_CUR 1 - относительно текущей позиции,

SEEK_END 2 - относительно конца файла.

Fseek возвращаются 0, если результат выполнения успешен, еще -1.    

Функция, чтобы удалить файл с названием(именем) FILE_NAME:

int remove (FILE_NAME);

Функция, чтобы переименовать файл:

int rename (const char *oldname, const char *newname);

5.II. Поблочный ввод и вывод.

UNIX операционная система обеспечивает услуги через набор запросов системы, которые являются в действительности функциями в пределах операционной системы, которые программисты могут использовать в обычных программах. Эта секция описывает, как использовать некоторых из наиболее важных запросов системы от C программ. Если Вы работаете в UNIX, это должно быть непосредственно полезно, т.к. позволяет использовать систему, с максимальной эффективностью. Даже если Вы используете C на различных операционных системах, Вы  получите понимание в программировании на C от изучения этих примеров; хотя детали изменяются, подобные функции имеются в любой системе. Использование этих функций очень важно для всех программ, которые используют большие множества информации на дисках, и не имеет достаточное место в памяти.

Здесь мы описываем ориентируемый блоком интерфейс входа/вывода, который является однородным для любых операционных систем. На любой специфической системе установившиеся практика стандартной библиотеки должны быть написаны в терминах средств обслуживания, обеспеченных системой хозяина.

5.II.1. Хэндлы Файла.

В UNIX операционной системе, любой ввод и вывод выполняется в виде файла, потому что все периферийные устройства, даже клавиатура и экран, - файлы. Это означает, что гомогенным единственным интерфейсом, обрабатывающим всю связь между программой и периферийными устройствами является файл.

В наиболее общем случае, прежде чем Вы читаем или пишем файл, Вы должен сообщить системе относительно вашего намерения делать так, такой процесс называется, открытие файла. Если Вы собираетесь писать в файле, необходимо создать его, или отказываться от его предыдущего содержания. Система проверяет ваше право делать так (файл существует? Вы имеете разрешение на доступ?), и если все хорошо, возвращает программе  неотрицательное целое число называемое ОПИСАТЕЛЕМ ФАЙЛА. Всякий раз, когда ввод или вывод должен быть выполнен на файле, описатель файла используется вместо его имени, чтобы идентифицировать файл. (Описатель файла аналогичен указателю файла, используемому стандартной библиотекой, или дескриптору файла МС-ДОС.) Вся информация относительно открытого файла поддерживается системой; программа пользователя обращается к файлу только через описатель файла.

Если мы открыли файл с fopen, возможно получить хэндл этого файла с функцией <stdio.h>

int fileno (FILE *fp);

Где fp - указатель файла на этот файл.

Для стандартных ввода и вывод, использующих клавиатуру и экран специальные указатели существуют, чтобы делать этот удобным. Такими указателями являются:

STDIN с описателями файла 0 для ввода с клавиатуры,

STDOUT c описателем 1 для вывода на экран,

и STDERR с описателем 2 для вывода на экран сообщения об ошибке. Если программа читает 0 и пишет 1 или 2, это может делать без того, чтобы волноваться относительно открывающихся файлов.

Пользователь программы может переадресовывать ввод - вывод к/от файлов с <и>:

           Prog <infile> outfile

В этом случае, вместо ввода с клавиатуры будет выполнен ввод из файла infile, а вывод будет сделан в файл outfile. Обычно описатель файла 2 остается приложенным к экрану, так что сообщения об ошибках всегда идти туда.

5.II.2. Нижний уровень Ввода/вывода.

Вход и вывод используют READ и WRITE запросы системы. Здесь, первый аргумент - описатель файла. Второй аргумент - буфер для приема или передачи данных в вашей программе. Третий аргумент - число байтов, которые будут переданы(перемещены).

           int n_read = read (int fd, char *buf, int n);

           int n_written = write (int fd, char *buf, int n);

Каждый запрос возвращает число переданных(перемещенных) байтов. На чтении, число возвращенных байтов может быть меньше чем указано параметром n. Ценность возвращения нулевых байтов подразумевает, что это конец файла, и -1 указывает ошибку некоторого вида. Для письма, ценность возвращения - число записанных байтов; ошибка произошла, если n не равно требуемому числу.