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

Пример использования низкоуровневого ввода-вывода

Код программы

Память

Память

 

программы

ОС

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 и

операционная система.

Потоки бывают двух видов: текстовые и двоичные.

Файловые операции чтения и записи низкого уровня (уровня ОС) выполняются функциями read и write соответственно начиная с

текущей позиции указателя

Используя функцию lseek, указатель можно установить в

произвольную позицию файла перед выполнением очередной

операции ввода/вывода

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

Высокоуровневый файловый ввод-вывод с использованием стандартной библиотеки

Файл – это поименованная область данных на внешнем носителе информации, используемая как базовый объект взаимодействия с данными в операционных системах.

Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки как единое целое.

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

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

объявленные в заголовочном файле stdio.h.

Консольный ввод-вывод – это не более чем частный случай файлового ввода-вывода.

В 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

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