
Программная инженерия. 1 курс 1 семестр / Лекции / L-06.OrganizaciyaVVvSi
.pdf
Пример использования низкоуровневого ввода-вывода
Код программы |
Память |
Память |
|
программы |
ОС |
fd1
buf
fd2
file1
file2
Файловая система
21

Пример использования низкоуровневого ввода-вывода
Код программы
Память ОС
->file1
0
Файловая система
22

Пример использования низкоуровневого ввода-вывода
Код программы
Память ОС
->file1
0
Файловая система
23

Пример использования низкоуровневого ввода-вывода
Код программы
Память ОС
->file1
10
Файловая система
24

Пример использования низкоуровневого ввода-вывода
Код программы
Память ОС
->file1
2010
Файловая система
25

Пример использования низкоуровневого ввода-вывода
Код программы
Память ОС
->file1
402010
Файловая система
26

Пример использования низкоуровневого ввода-вывода
Код программы
Память ОС
->file1
50402010
Файловая система
27

4. Высокоуровневый интерфейс языка Си. Стандартные потоки
Основная концепция ввода-вывода
вСи — это концепция потоков:
Любая операция ВВ рассматривается как операция с последовательностью байт.
Причём нет никакой разницы откуда поступают эти байты или куда они направлены.
При выводе мы направляем некоторые данные в поток, а
этот поток в разное время может быть связан с различными устройствами.
Когда программа начинает выполняться (запускается процесс в ОС Linux), автоматически открываются пять потоков (5 file handle – уже автоматически открыты), которые по умолчанию соединены с консолью:
Эти потоки:
stdin 0 (stdin) – предназначен для ввода данных с консоли
(scanf, gets, getchar);
stdout 1 (stdout) – предназначен для вывода данных на консоль (с этим потоком используются функции printf, puts, putchar);
stderr 2 (stderr) – предназначен для вывода сообщений об ошибках на консоль.
Для работы с потоком используется функция void perror(const char* str),
параметр str указывает на строку, содержащую сообщение об ошибке.
stdaux 3 (stdaux) |
– стандартный последовательный порт. |
|
stdprn 4 (stdprn) |
– стандартное устройство печати. |
Windows |
|
|
Процесс перемещения данных с внешних носителей в оперативную память называется вводом данных, а из памяти на внешние носители – выводом.
Поток – последовательность байт данных.
Поток байт, принимаемый программой, называется потоком ввода, а поток, посылаемый программой на устройство, называется потоком вывода.
Основное преимущество работы с потоками состоит в том, что
потоки являются независимыми от устройства.
Программа рассматривает ввод-вывод как работу с непрерывным потоком байт, независимо от их происхождения
или места назначения.
Каждый поток в Cи связан с файлом.
В этом смысле термин «файл» ассоциируется с различными
устройствами и не относится только к файлам, хранящимся на диске.
Файл понимают как промежуточный объект между потоком и
реальным физ. устройством, выполняющим ввод-вывод
данных.
В Cи не приходится беспокоиться о деталях работы с файлами, т.к. автоматическое взаимодействие между потоками, файлами и устройствами обеспечивают библиотечные функции C и
операционная система.
Потоки бывают двух видов: текстовые и двоичные.
Файловые операции чтения и записи низкого уровня (уровня ОС) выполняются функциями read и write соответственно начиная с
текущей позиции указателя
Используя функцию lseek, указатель можно установить в
произвольную позицию файла перед выполнением очередной
операции ввода/вывода
Проверка выхода за конец файла осуществляется функцией eof По умолчанию стандартный ввод/вывод и стандартный вывод сообщений об ошибках связывается с консольным терминалом. 28

Высокоуровневый файловый ввод-вывод с использованием стандартной библиотеки
Файл – это поименованная область данных на внешнем носителе информации, используемая как базовый объект взаимодействия с данными в операционных системах.
Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки как единое целое.
Вфайлах размещаются данные, предназначенные для длительного хранения. Файл обязательно имеет имя, формат которого определяется используемой файловой системой ОС.
Вязыке Cи для осуществления файлового ввода-вывода используются механизмы стандартной библиотеки языка,
объявленные в заголовочном файле stdio.h.
Консольный ввод-вывод – это не более чем частный случай файлового ввода-вывода.
В C++ для ввода-вывода часто используются потоковые типы данных.
Однако все эти механизмы являются всего лишь надстройками над низкоуровневыми механизмами вводавывода ядра ОС.
Функции библиотеки ввода-вывода языка Си, поддерживающие обмен данными с файлами на уровне потока, позволяют обрабатывать данные различных размеров и форматов, обеспечивая при этом буферизованный ввод и вывод. Таким образом,
Поток – это файл либо внешнее устройство вместе с предоставляемыми средствами буферизации.
Сточки зрения модели КИС (Клиент-Интерфейс-Сервер),
сервером стандартных механизмов ввода-вывода языка Cи
(printf, scanf, FILE*, fprintf, fputc и т. д.) является библиотека языка. А сервером низкоуровневого ввода-вывода в Linux
является само ядро ОС (отдельная тема лекции, ПЗ, ЛР).
При работе с потоком (файлом/ устройством) можно производить следующие действия:
открывать и закрывать потоки (связывать указатели на потоки с конкретными файлами);
вводить и выводить: символ, строку, форматированные данные, порцию данных произвольной длины;
анализировать ошибки потокового ввода-вывода и условие достижения конца потока (конца файла);
управлять буферизацией потока и размером буфера;
получать и устанавливать указатель (индикатор) текущей позиции в потоке.
Для того чтобы можно было использовать функции библиотеки ввода-вывода языка Си, в программу необходимо включить заголовочный файл stdio.h:
#include <stdio.h>
который содержит прототипы функций ввода-вывода, а также определения констант, типов и структур, необходимых для работы функций обмена с потоком.
На рис. показаны возможные информационные обмены исполняемой программы на локальной (не сетевой) ЭВМ.
29

Действия над файлами
Действия над файлами:
Основные операции:
Открытие файлов.
Чтение и запись данных.
Закрытие файлов.
Дополнительные операции:
Навигация по файлу.
Обработка ошибок.
Удаление и переименование файлов.
Описание файловой переменной
Библиотека stdio.h
FILE *имя = NULL;
Открытие файла
FILE *fopen(const char *filename, const char *mode);
filename – название файла.
mode – режим открытия.
Функция возвращает указатель на файл, если тот был успешно открыт. В противном случае – NULL.
Перенаправление потоков
FILE * freopen(const char *filename, const char *mode, FILE
*stream);
Функция возвращает:
Указатель на файл – все нормально, NULL – ошибка переопределения.
Закрытие файла
int fclose(FILE *stream);
stream - указатель на открытый файл.
Функция возвращает:
0 – файл успешно закрыт.
1 – произошла ошибка закрытия файла.
Проверка на достижение конца файла int feof(FILE *stream);
stream - указатель на открытый файл. Функция возвращает:
0 – если конец файла еще не достигнут. !0 – достигнут конец файла.
Ввод-Вывод данных в файл
В языке Си имеется большой набор функций для работы с файлами, большинство которых находятся в библиотеках stdio.h и io.h.
При этом потоки данных, с которыми работают функции ввода-вывода данных по умолчанию, буферизированы. Это означает, что при открытии потока с ним автоматически связывается определенный участок ОП, который и называется
буфером.
Все операции чтения-записи ведутся через этот буфер.
Его размер фиксирован специальной константой BUFSIZ, которая определена в файле stdio.h как 512 (хотя программно ее можно
изменять). |
30 |