Выбрать главу

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

Если производится операция записи в файл, то информация из буфера записывается в файл при заполнении буфера или при закрытии файла (или при выполнении каких-то других условий, смотри ниже). Если информация считывается из файла, то она на самом деле берется из буфера, а в буфер информация считывается из файла при открытии файла и впоследствии каждый раз при исчерпании (опустошении) буфера. Буферизация ввода/вывода выполняется автоматически, она позволяет ускорить выполнение программы за счет уменьшения количества обращений к сравнительно медленно работающим внешним устройствам.

Для пользователя файл, открытый на верхнем уровне, представляется как последовательность считываемых или записываемых байтов. Чтобы отразить эту особенность организации ввода/вывода, предложено понятие "поток" (соответствует английскому слову stream). Когда файл открывается, с ним связывается поток, выводимая информация записывается "в поток", считываемая информация берется "из потока".

Когда поток открывается для ввода/вывода, он связывается со структурой типа FILE (имя типа FILE определяется с помощью конструкции typedef в файле stdio.h). Структура содержит разнообразную информацию о файле. При открытии файла с помощью функции fopen возвращается указатель на структуру типа FILE. Этот указатель (указатель потока) используется для последующих операций с файлом, пользователь не обязан вникать в способ организации потока, он только должен сохранить полученный указатель и передавать его значение всем библиотечным функциям, используемым для ввода/вывода через этот поток.

Функции в/в верхнего уровня дают возможность для буферизованного форматированного и неформатированного ввода/вывода.

Функции в/в верхнего уровня относятся к числу функций, одинаково реализуемых в различных ОС и на разных компьютерах, с их помощью пользователь имеет возможность писать переносимые программы.

Функции ввода/вывода для консоли и порта распространяют возможности функций ввода/вывода верхнего уровня на этот класс устройств, добавляя новые возможности.

Они позволяют читать или записывать на консоль (терминал) или в порт ввода/вывода (например, порт принтера). Функции в/в с портом читают или записывают данные побайтно. Некоторые дополнительные режимы устанавливаются для в/в с консоли (например: ввод с эхо-печатью символов и без эхо-печати).

Функции в/в для консоли и порта являются уникальными для компьютеров типа IBM/PC.

Функции в/в низкого уровня не выполняют буферизацию и форматирование данных; они позволяют непосредственно пользоваться средствами ввода/вывода операционной системы.

При низкоуровневом открытии файла (при помощи функции open) с ним связывается дескриптор (handle). Дескриптор является целым значением, характеризующим размещение информации об открытом файле во внутренних таблицах системы. Дескриптор используется при последующих операциях с файлом.

Функции в/в нижнего уровня из стандартной библиотеки целесообразно использовать при разработке своей собственной подсистемы ввода/вывода.

Функции в/в нижнего уровня переносимы в рамках некоторых систем программирования Си, в частности относящихся к ОС UNIX.

Функции вода/вывода высокого уровня
Функция Краткое описание clearerr очистка флажка ошибки для потока fclose закрытие потока fcloseall закрытие всех открытых (на верхнем уровне) файлов fdopen создание потока для файла, ранее открытого на нижнем уровне, используя дескриптор feof проверка на конец потока ferror проверка флажка ошибок потока flush сброс буфера потока на связанное с ним внешнее устройство fgetc чтение символа из потока fileno получение дескриптора файла, связанного с потоком fgetchar чтение символа из стандартного потока ввода stdin fgets чтение строки из потока flushall сброс буферов всех потоков fopen открытие потока (открыть файл и связать его с потоком) fprint запись данных в поток по формату fputc запись символа в поток fputchar запись символа в стандартный поток вывода stdout fputs запись строки в поток fread неформатированное чтение данных из потока freopen повторное открытие потока в новом режиме fscanf чтение из потока по формату fseek перемещение указателя файла в заданную позицию ftell получение текущей позиции указателя файла fwrite неформатированная запись данных в поток getc чтение символа из потока (реализуется через макроопределение) getchar чтение символа из потока stdin (версия макро) gets чтение строки из потока stdin getw чтение двух байтов (по размеру int) в формате слова из потока printf запись данных в поток stdout по формату putc запись символа в поток (версия макро) putchar запись символа в поток stdout (версия макро) puts запись строки в поток putw запись двух байтов (по размеру int) в формате слова в поток rewind установка указателя по файлу на начало файла scanf чтение данных из потока stdin по формату setbuf управление буферизацией потока setvbuf управление буферизацией потока и размером буфера sprintf запись данных в строку по формату sscanf чтение данных из строки по формату tempnam сгенерировать имя временного файла в заданном каталоге tmpfile создать временный файл ungetc вернуть символ в поток vfprintf запись данных в поток по формату vsprintf запись данных в строку по формату