Скачиваний:
2
Добавлен:
03.01.2024
Размер:
3.49 Mб
Скачать

СПбГУТ им. проф. М.А. Бонч-Бруевича Кафедра программной инженерии и вычислительной техники (ПИ и ВТ)

ПРОГРАММИРОВАНИЕ

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

Брайэн Керниган

Лекция 6: Организация ввода-вывода в Си

1.Ввод-вывод в ЭВМ

2.Средства ввода-вывода в языке Си

3.Низкоуровневый интерфейс языка Си

4.Высокоуровневый интерфейс языка Си Приложения (справочник по командам)

Санкт–Петербург, 2023г.

Введение

Ввод-вывод (input-output, IO/ВВ) в информатике — взаимодействие между обработчиком информации (например, компьютер) и внешним миром, который может представлять как человек (субъект), так и любая другая система обработки информации.

Ввод — сигнал или данные, полученные системой. Вывод — сигнал или данные, посланные ею (или из неё).

Термин также может использоваться как обозначение (или дополнение к обозначению) определенного действия: «выполнять ввод-вывод» означает выполнение операций ввода или вывода.

Устройства ВВ используются человеком (или другой системой) для взаимодействия с компьютером.

Например, клавиатуры и мыши — специально разработанные компьютерные устройства ввода, а мониторы и принтеры — компьютерные устройства вывода.

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

ВВ вычислительных систем — на него никто не обращает внимания. Всеобщий любимчик — процессор (ЦП), а подсистема ввода-вывода (ПВВ) рядом с ним — падчерица.

Вот пример: когда надо охарактеризовать производительность компьютера чаще всего начинают считать мегагерцы.

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

Подсистема памяти (ПП), и то, как важна ее роль в общей производительности вычислительной системы.

Роль ВВ не менее значима.

Подсистема ВВ определяет время отклика и производительность большинства компьютеров.

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

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

Тогда единственным их отличием станут системы вводавывода.

Примеры:

Система AS/400 обладала не очень уж быстрыми процессорами. Тем не менее, она прекрасно выглядела при сопоставлении с другими системами и, зачастую, могла посрамить систему с более быстрым процессором. Совершать такие подвиги ей позволяло и позволяет "секретное оружие" — одна из самых искусных и мощных подсистем ВВ.

Типы систем ВВ

Обработка ВВ

 

Обработка ВВ

центральным

 

специальными

процессором

 

процессорами ВВ

(CPU)

 

(IOP)

 

 

 

IBM PC

 

AS/400, S/390 и т.д.

Параллельная обработка ВВ 2

1. Ввод-вывод в ЭВМ

Основные функции подсистемы ввода-вывода (ВВ):

Организация параллельной работы устройств ВВ и ЦП.

Согласование скоростей обмена и кэширование данных.

Разделение устройств и данных между процессами.

Обеспечение удобного логического интерфейса между устройствами и остальной частью системы.

Поддержка широкого спектра драйверов с возможностью простого включения в систему нового драйвера.

Динамическая загрузка и выгрузка драйверов.

Поддержка нескольких файловых систем.

Поддержка синхронных и асинхронных операций ВВ.

Операционная

система

Интерфейс драйвер – ядро (Driver Kernel Interface, DKI)

Функции драйвера:

Обработка запросов записи-чтения от программного обеспечения управления устройствами. Постановка запросов в очередь

Проверка входных параметров запросов и обработка ошибок

Инициализация устройства и проверка статуса устройства

Управление энергопотреблением устройства.

Регистрация событий в устройстве

Выдача команд устройству и ожидание их выполнения возможно в блокированном состоянии до поступления прерывания от устройства

Проверка правильности завершения операции

Передача запрошенных данных и статуса завершенной операции

Обработка нового запроса при незавершенном предыдущем запросе (для реентерабельных драйверов)

Классификация устройств ввода-вывода

Драйвер

Контроллер

Внешнее устройство

Интерфейс драйвер – устройство (Driver Device Interface, DDI)

Аппаратный

низкоуровневый интерфейс контроллер – устройство

Типы устройств по функциональному назначению

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

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

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

Типы устройств по принципам функционирования

Блочные, хранящие информацию в виде

адресуемых блоков фиксированного

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

Символьные, принимающие или предоставляющие поток символов без какой-либо структуры (принтеры, модемы, сетевые карты).

3

Различия в характеристиках устройств ввода-вывода

Gigabit Ethernet

Графический

монитор

Жесткий диск

Ethernet

Оптический диск

Сканер

Лазерный принтер

Гибкий диск

Модем

Мышь

Клавиатура

Скорость передачи данных (на несколько порядков).

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

Сложность управления (для принтера относительно простой интерфейс управления, для диска – намного сложнее).

Единицы передачи данных.

Данные могут передаваться блоками или потоком байтов или символов.

Представление данных. Различные устройства используют разные схемы кодирования данных, включая различную кодировку символов и контроль четности.

Условия ошибок. Природа ошибок,

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

101

102

103

104

105

106

107

108

109

Бит в секунду

4

 

 

 

Многослойная модель подсистемы ввода-вывода

 

 

 

 

Дисковые

устройства

Графические

 

Сетевые

устройства

 

 

 

 

 

 

устройства

 

 

 

 

 

 

 

Системные

 

вызовы

 

 

связывание,обменМежмодульный, синхронизация,буферизация, к

 

Блок-ориентированный интерфейс

Байт-ориентированный интерфейс

 

подсистемамдругим

 

VFS

 

 

Менеджер окон

 

HTTP

FTP

SMB

Файловые системы

 

Высокоуровневые

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

UFS

NTFS

FAT

графические

 

TCP/UDP

SPX

 

 

драйверы

 

 

 

Дисковый кэш

 

Низкоуровневые

 

IP

IPX

NetBEUI

 

 

 

графические

 

 

 

 

 

 

 

 

 

 

драйверы

 

 

 

 

 

 

Драйвер HD

Драйвер FD

 

 

Ethernet

FR

ATM

 

 

Диспетчер прерываний,

функции доступа

к

аппаратуре

 

 

Контроллеры

 

 

 

 

 

 

 

 

Устройств ввода-вывода

HDD

 

FDD

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Диски

 

 

 

 

 

5

2. Средства ВВ в языке Си. Потоки ввода-вывода

 

Программа

 

Загрузка в ОП

 

 

на диске

 

 

 

 

 

 

 

(файл)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Любая операция ВВ

 

 

 

 

 

 

 

 

Процесс

 

 

рассматривается как

 

 

 

 

 

операция с

 

 

 

в памяти

 

последовательностью байт.

 

 

 

 

Причём нет никакой разницы

 

 

 

 

 

 

stdin

 

 

откуда поступают эти байты

 

 

Стандартные

 

 

 

 

 

или куда они направлены.

 

 

 

 

 

stdout

потоки ВВ.

При выводе мы направляем

 

 

 

 

 

 

Предоставляет ОС

 

некоторые данные в поток, а

 

 

 

 

 

 

stderr

 

этот поток в разное время

 

 

 

 

 

 

 

 

 

может быть связан с

 

 

 

 

 

 

различными устройствами.

 

 

 

 

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

При запуске процесса ему предоставляются предопределённые стандартные потоки.

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

Поддержка потоков включена в большинство языков программирования и во все современные операционные системы.

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

Считываемая и записываемая информация представляет собой

последовательность байтов – "поток" (stream).

Поток (в терминах Си) – это байтовая последовательность, передаваемая в процессе ввода-вывода.

Поток должен быть связан с каким-либо внешним устройством или файлом на диске. В терминологии Си это звучит так: поток должен быть направлен на какое-то устройство или файл (от источника информации к приёмнику информации).

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

При организации ввода-вывода в Си используется буферизация, то есть обмен информацией между программой и внешним устройством происходит не непосредственно, а через буфер

специально выделяемую системой область оперативной памяти.

Буферизация ускоряет работу программы из-за уменьшения количества обращений к внешним устройствам.

Вбиблиотеке описана константа BUFSIZE, величина которой

512:

#define BUFSIZE

512

Поток – последовательность байт данных.

Поток байт, принимаемый программой, называется

потоком ввода, а поток, посылаемый программой на

 

устройство, называется потоком вывода.

6

Средства ввода-вывода в языке Си

«Классический» ввод/вывод

В языке Си определены три стандартных потока ввода-

вывода (для ОС Linux):

stdin – стандартное устройство ввода (клавиатура);

stdout – стандартное устройство вывода (экран);

stderr – стандартное устройство вывода сообщения об ошибках (также экран).

Простейший ввод-вывод:

getch() – ввод одного символа без отображения его на экране; getche() – ввод одного символа с отображением его на экране; putchar(int c) – вывод одного символа на экран.

Все эти функции требуют включения заголовочного файла

<conio.h>:

#include <conio.h>

Все остальные функции ввода/вывода определены в заголовочном файле <stdio.h>.

Ввод-вывод с экрана

Для ввода и вывода на экран используются функции scanf и printf соответственно, прототипы которых имеют следующий вид: int scanf (char *format, ...);

int printf(char *format, ...);

Вывод осуществляется функцией printf, которая имеет следующий синтаксис:

printf(<строка описания форматов> [, <список вывода>]);

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

Обычные символы и управляющие последовательности

просто копируются в стандартный выходной поток в порядке их появления.

Спецификации формата начинаются с символа % и

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

Список вывода состоит из переменных и/или констант,

значения которых должны быть выведены.

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

Ввод осуществляется функцией scanf, которая имеет следующий синтаксис:

scanf(<строка описания форматов> [, <список ввода>]);

Строка описания форматов состоит из набора спецификаций формата, таких же, как для функции printf.

Список ввода состоит из адресов переменных, куда будут заноситься вводимые значения.

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

Функция scanf возвращает количество успешно введенных и преобразованных значений.

Функция printf возвращает количество символов, записанных в выходной поток.

Описание управляющих последовательностей см. в

 

Приложении к лекции

7

Примеры форматного ввода-вывода

# include <stdio.h>

Основные модификаторы формата:

%d – десятичное целое число;

%c – один символ;

%s – строка символов;

scanf (”%d%f”, &k, &a ); // с клавиатуры вводятся эти данные: k=5, a=0.527

%f – число с плавающей точкой,

 

адреса переменных

десятичная запись;

 

%lf – число с плавающей точкой,

printf (”\nk=%d a=%f”, k, a ); // они же отображаются на экране: k=5, a=0.527

удвоенной точности;

%e – число с плавающей точкой в

 

 

экспоненциальной форме;

 

имена переменных,

%p – указатель (адрес);

 

– восьмеричное целое число;

 

имеющих значения

 

%x – шестнадцатеричное целое число.

 

 

# include <stdio.h>

 

(см. приложение)

 

 

int main ( )

 

printf("INT – %d; DOUBLE – %lf; CHAR – %c", 5, 4.35, 'а' );

{

 

 

Результат:

int a, b, c e;

 

 

INT – 5; DOUBLE – 4.350000; CHAR – а

 

 

printf (”Введите данные: ”);

scanf (”%d%i%o%u%x”, &a, &b, &c, &d, &e,);

Результаты работы операторов печати:

// Все целые.

printf (”%d %d %d %d %d\n”, a, b, c, d, e); return 0;

}

8

Примеры форматного ввода-вывода

В модификаторах формата функции printf() после символа % можно указывать строку цифр, задающую минимальную ширину поля вывода, например: %5d (для целых), %4.2f (две цифры после запятой для поля, шириной 4 символа).

double u=56.45674;

printf("\n%lf", u); printf("\n%4.2lf", u); printf("\n%4.3lf", u); printf("\n%5.1lf", u); printf("\n%6lf", u);

Аргументами функции printf() могут быть переменные, константы, выражения, вызовы функции.

Главное, чтобы их значения соответствовали заданной спецификации.

Управляют выводом специальные последовательности.

Например,

\n – новая строка

\t – горизонтальная табуляция

Если нужно напечатать сам символ %, то его нужно указать 2 раза.

printf("Только %d%% предприятий не работало. \n",5);

Получим: Только 5% предприятий не работало.

Можно использовать функцию printf() для нахождения кода ASCII некоторого символа.

printf("%c = %d\n", 'a', 'a');

Получим изображение и десятичный ASCII код символа 'a': a = 97

#include<stdio.h>

#include<conio.h> void main()

{

float f=125.0;

//Надежда на интеллект компилятора printf("\n??? %f %d %x %f", f, f, f, f);

//На компилятор не надейся. //Приводи тип в соответствие

printf("\n*** %f %d %x %f", f, (int)f, (int)f, f); getch();

}

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

puts("Печатаемая строка");

Функция putchar – выводит на экран дисплея один символ без добавления символа '\n '.

putchar('A');

putchar(65);

9

Функции ввода

Функция форматированного ввода scanf описывается: scanf ("управляющая строка", а1, а2, …, an);

Управляющая строка содержит только модификаторы форматов.

Аргументы (а1, а2, …, an) – адреса переменных, разделенные запятыми (перед именем переменной записывается символ &).

Исключение – строки символов. int course;

float grant;

char name[20]; //строка символов printf("Укажите курс, стипендию, имя \n"); scanf("%d%f%s", &course, &grant, name);

Функция scanf() ввод строки по формату %s производит только до первого пробела.

char name[20];

…………………….

scanf("%s", name); puts(name);

Для ввода фраз, состоящих из слов используется функция: gets(<ID строковой переменной>);

char name[20];

……………………

gets(name); puts(name);

Работа с файлами

Файл − блок информации на внешнем запоминающем устройстве компьютера, имеющий определённое логическое представление (начиная от простой последовательности битов или байтов и заканчивая объектом сложной СУБД), соответствующие ему операции чтения-записи и, как правило, фиксированное имя (символьное или числовое), позволяющее получить доступ к этому файлу и отличить его от других файлов

Работа с файлами реализуется средствами операционных систем (ОС, файловая подсистема ОС).

Многие ОС приравнивают к файлам и обрабатывают сходным образом и другие ресурсы:

области данных (необязательно на диске);

устройства — как физические, например, порты или принтеры, так и виртуальные (генератор случайных чисел);

потоки данных (именованный канал);

сетевые ресурсы, сокеты;

объекты ОС.

10

Соседние файлы в папке Лекции