Функции стандартного ввода и вывода

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

Сначала рассмотрим подробнее структуру форматной спецификации. Она имеет следующий общий вид:

%<флаги><ширина><.точность><модификатор>тип

В символы <> заключены необязательные элементы спецификации, таким образом, единственным обязательным элементом является тип. Символы управления форматированием, составляющие различные элементы спецификации, описаны в табл. 8.9.

Таблица 8.9. Символы управления форматированием

Элемент спецификации Действие
флаги
выравнивание числа влево в пределах выделенного поля, справа дополняется пробелами. По умолчанию устанавливается выравнивание влево
+ выводится знак числа символом "‑" или "+"
пробел перед положительным числом выводится пробел, для отрицательных всегда выводится знак "-"
# для целых чисел выводится идентификатор системы счисления: 0 перед числом для вывода в 8‑ричной с.с. 0x или 0X перед числом для вывода в 16‑ричной с.с. ничего для чисел, выводимых в 10‑ной с.с. Выводится десятичная точка для чисел типа float
ширина – воздействует только на вывод
n целое n определяет минимальную ширину поля в n символов. Если этой ширины недостаточно, выводится столько символов, сколько есть. Незаполненные позиции дополняются пробелами.
0n то же, что n, но позиции слева для целого числа дополняются нулями
* следующий аргумент из списка аргументов задает ширину
точность – воздействует только на вывод
ничего точность по умолчанию
.0 для d,i,o,u,x точность по умолчанию. Для e,E,f десятичная точка отсутствует
.n Для e,E,f не более n знаков после точки
* следующий аргумент из списка аргументов задает точность
модификатор – действует там, где применим
h для d, i, o, u, x, X аргумент является short int
l для d, i, o, u, x, X аргумент является long int для e, E, f, F, g, G аргумент является double (обычно работает только для scanf)
тип переменной
с Тип char При вводе читается и передается 1 байт. При выводе переменная преобразуется к типу char. В файл передается 1 байт
  d i o u x X Тип int десятичное целое со знаком десятичное целое со знаком 8‑ричное целое без знака 10‑ное целое без знака 16‑ричное целое без знака. При выводе использует a…f 16‑ричное целое без знака. При выводе использует A…F При вводе действие x и X не различается
  f e E g G Тип float число со знаком в формате <->dddd.ddd число со знаком в формате <->dddd.ddde<+ или ‑>ddd число со знаком в формате <->dddd.dddE<+ или ‑>ddd При вводе e и E не различаются число со знаком в формате e или f в зависимости от указанной точности число со знаком в формате E или F в зависимости от указанной точности При вводе действие g и G не различается
  s p Тип char * При вводе принимает символы без преобразования, пока не встретится разделитель '\n' или не достигнута указанная точность. В программу передаются символы до '\n' или пробела. При выводе выдает в поток все символы, пока не встретится '\0' или не достигнута указанная точность Выводит аргумент как адрес, формат зависит от модели памяти, в общем случае, включает 16‑ричные сегмент и смещение

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

Функции ввода/вывода делятся на три класса:

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

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

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

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

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

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

Функции этого класса позволяют читать или записывать на консоль (терминал) или в порт ввода/вывода (например, порт принтера). Они обрабатывают данные побайтно. Для ввода или вывода с консоли устанавливаются некоторые дополнительные режимы, например, ввод с эхо‑печатью символов или без нее, установка окна вывода, цветов текста и фона. Функции для консоли и порта являются уникальными для компьютеров, совместимых с IBM‑PC.

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

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: