Язык программирования Си для персонального компьютера
Шрифт:
Для пользователя файл, открытый на верхнем уровне, представляется как последовательность считываемых или записываемых байтов. Чтобы отразить эту особенность организации ввода/вывода, предложено понятие "поток" (соответствует английскому слову 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 | запись данных в строку по формату |
Система программирования MSC дополнительно предоставляет следующие функции:
| Функция | Краткое описание |
| rmtemp | удаление временных файлов, созданных посредством функции tmpfile |
| tmpnam | сгенерировать имя временного файла |
| vprintf | запись данных в поток stdout по формату |
Система программирования ТС дополнительно предоставляет следующие функции:
| Функция | Краткое описание |
| vfscanf | эти функции подобны функциям fscanf, scanf и sscanf, но принимают как параметр указатель на список аргументов — адресов переменных, которым присваиваются вводимые значения |
| vscanf | |
| vsscanf |
Прототипы всех функций ввода/вывода верхнего уровня содержатся в файле stdio.h.
Некоторые константы, определенные в stdio.h, могут быть полезны в программе:
| константа EOF | код, возвращаемый как признак конца файла |
| константа NULL | значение указателя, который не содержит адрес никакого реально размещенного в оперативной памяти объекта |
| константа BUFSIZ | определяет размер буфера потока в байтах |
| имя типа FILE | структура, которая содержит информацию о потоке |
Высокоуровневое открытие файлов
Функции открытия потока возвращают указатель на тип FILE (этот указатель называют также указателем потока), этот указатель используется при дальнейших обращениях к потоку.
Стандартные потоки: stdin, stdout, stdeir, stdaux, stdprn.
Когда программа начинает выполняться, автоматически открываются пять потоков. Эти потоки — стандартный ввод (stdin), стандартный вывод (stdout), стандартный вывод для сообщений об ошибках (stderr), стандартный последовательный порт (stdaux) и стандартное устройство печати (stdprn).
По умолчанию стандартный ввод/вывод и стандартный вывод сообщений об ошибках связывается с консольным терминалом.
Назначения по умолчанию для стандартного порта и стандартного устройства печати зависят от конфигурации аппаратуры компьютера; эти потоки обычно связываются с последовательным портом и принтером, но могут быть и не установлены в отдельных системах.
Следующие указатели на структуру типа. FILE определяются в файле stdio.h и могут использоваться в любом месте как указатели потоков:
extern FILE * stdin; — стандартный ввод
extern FILE * stdout; — стандартный вывод
extern FILE * stderr; — стандартный вывод сообщений об ошибках
extern FILE * sidaux; — стандартный порт
extern FILE * stdprn; — стандартное устройство печати
При запуске оттранслированной программы на выполнение можно использовать символы перенаправления в/в из командного языка MS-DOS ( < , > или >> ) для переопределения стандартного ввода и вывода программы.
Можно переопределить stdin, stdout, stderr, stdaux или stdprn так, что они будут относиться к файлу на диске или устройству. Такие возможности предоставляет функция freopen.
Управление буферизацией потоков
Открытые файлы, для которых осуществляется высокоуровневый ввод/вывод, буферизуются по умолчанию, за исключением потоков stdin, stdout, stderr, stdaux, stdprn.
Потоки stderr и stdaux — не буферизованы. Если к ним применяется функция printf или scanf, создается временный буфер. Для обоих потоков может задаваться буферизация с помощью функций setbuf или setvbuf.