НазадОглавлениеДалее

9.6.1. Функции вода/вывода высокого уровня

ФункцияКраткое описание
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 дополнительно предоставляет следующие функции:
ФункцияКраткое описание
rmtmpудаление временных файлов, созданных посредством функции tmpfile
tmpnamсгенерировать имя временного файла
vprintfзапись данных в поток sldout по формату

Система программирования ТС дополнительно предоставляет следующие функции:
ФункцияКраткое описание
vfscanf, vscanf, vsscanfэти функции подобны функциям fscanf, scanf и sscanf, но принимают как параметр указатель на список аргументов-адресов переменных, которым присваиваются вводимые значения

Прототипы всех функций ввода/вывода верхнего уровня содержатся в файле stdio.h.

Некоторые константы, определенные в stdio.h, могут быть полезны в программе:
ФункцияКраткое описание
константа EOFкод, возвращаемый как признак конца файла
константа NULLзначение указателя, который не содержит адрес никакого реально размещенного в оперативной памяти объекта
константа BUFSIZопределяет размер буфера потока в байтах
имя типа FILEструктура, которая содержит информацию о потоке

9.6.1.1. Высокоуровневое открытие файлов

Функции открытия потока возвращают указатель на тип FILE (этот указатель называют также указателем потока), этот указатель используется при дальнейших обращениях к потоку.

9.6.1.2. Стандартные потоки: stdin, stdout, stderr, stdaux, stdprn

Когда программа начинает выполняться, автоматически открываются пять потоков. Эти потоки - стандартный ввод (stdin), стандартный вывод (stdout), стандартный вывод для сообщений об ошибках (stderr), стандартный последовательный порт (stdaux) и стандартное устройство печати (stdprn).

По умолчанию стандартный ввод/вывод и стандартный вывод сообщений об ошибках связывается с консольным терминалом.

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

Следующие указатели на структуру типа FILE определяются в файле stdio.h и могут использоваться в любом месте как указатели потоков:

extern FILE * stdin; - стандартный ввод

extern FILE * stdout; - стандартный вывод

extern FILE * stderr; - стандартный вывод сообщений об ошибках

extern FILE * stdaux; - стандартный порт

extern FILE * stdprn; - стандартное устройство печати

При запуске оттранслированной программы на выполнение можно использовать символы перенаправления в/в из командного языка MS-DOS (<, > или >>) для переопределения стандартного ввода и вывода программы.

Можно переопределить stdin, stdout, stderr, stdaux или stdprn так, что они будут относиться к файлу на диске или устройству. Такие возможности предоставляет функция freopen.

9.6.1.3. Управление буферизацией потоков

Открытые файлы, для которых осуществляется высокоуровневый ввод/вывод, буферизуются по умолчанию, за исключением потоков stdin, stdout, stderr, stdaux, stdprn.

Потоки stderr и stdaux - не буферизованы. Если к ним применяется функция printf или scanf, создается временный буфер. Для обоих потоков может задаваться буферизация с помощью функций setbuf или setvbuf.

Буферизация для потоков stdin, stdout, stdprn выполняется следующим образом: буфер сбрасывается при его заполнении или когда вызванная библиотечная функция ввода/вывода завершает работу.

Использованием функции setbuf или setvbuf можно сделать поток небуферизованным или связать буфер с небуферизованным до этого потоком. Буфера, размещенные в системе, недоступны пользователю, кроме буферов, полученных с помощью setbuf или setvbuf.

Буфера должны иметь постоянный размер, равный константе BUFSIZ в stdio.h.

Если используется setvbuf, размер буфера устанавливает пользователь. Буфера автоматически сбрасываются при их наполнении, или когда связанный с буфером файл закрывается, или когда происходит нормальное завершение программы.

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

9.6.1.4. Закрытие потоков

Функции fclose и fcloseall закрывают поток или потоки.

Функция fclose закрывает один заданный поток, fcloseall - все потоки, кроме потоков stdin, stdout, stderr, stdaux, stdprn.

Если программа не выполняет закрытия потоков, потоки автоматически закрываются, когда программа завершается неаварийно. Однако следует закрывать потоки по завершении работы с ними, так как число потоков, которые могут быть открыты одновременно, ограничено.

9.6.1.5. Чтение и запись данных

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

Операции чтения и записи в потоках начинаются с текущей позиции в потоке, идентифицируемой как "file pointer" (указатель файла) для потока. Указатель файла изменяется после выполнения операции чтения или записи.

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

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

9.6.1.6. Обнаружение ошибок

Когда происходит ошибка в операции с потоком, устанавливается в ненулевое значение флажок ошибки для потока. Можно использовать макроопределение ferror, чтобы определить, произошла ли ошибка.

После каждой ошибки флажок ошибки остается установленным до тех пор, пока не будет сброшен вызовом функции clearerr или rewind.


НазадОглавлениеДалее