- •Алфавит.
- •Объявления и определения
- •Структура и компоненты простой программы
- •Текст программы и препроцессор.
- •Структура программы.
- •Функция форматированного вывода.
- •Программы печати предельных констант.
- •Применимость вещественных данных.
- •Выделение лексем из текста программы.
- •2.2. Элементарные средства программирования Деление операторов языка Си на группы.
- •Программа оценки машинного нуля.
- •Трассировочная таблица
- •Переключатели
- •Ввод данных.
- •Вычисление объема цилиндра.
- •Операторы цикла
- •Три формы операторов цикла.
- •Приближенное значение экспоненты.
- •Оператор break.
- •Сумма отрезка степенного ряда.
- •Оператор continue.
- •Суммирование положительных чисел.
- •2.4. Массивы и вложение операторов цикла Массивы и переменные с индексами.
- •Вычисление среднего и дисперсии.
- •Упорядочение в одномерных массивах.
- •Инициализация массивов.
- •Моделирование многомерных массивов.
- •Ввод и вывод
- •7.1. Потоковый ввод-вывод
- •7.1.1. Открытие и закрытие потока
- •7.1.2. Стандартные файлы и функции для работы с ними
- •Ввод-вывод отдельных символов.
- •Ввод-вывод строк.
- •Форматный ввод-вывод.
- •Спецификаторы форматной строки для функции форматного вывода
- •Спецификаторы форматной строки для функции форматного ввода
- •Работа с файлами на диске
- •Двоичный (бинарный) режим обмена с файлами.
- •Строковый обмен с файлами.
- •Позиционирование в потоке.
- •Трехъязычный словарь "Цифры
- •7.2. Ввод-вывод нижнего уровня
- •7.2.1. Открытие / закрытие файла
- •7.2.2. Чтение и запись данных
- •7.2.3. Произвольный доступ к файлу
- •Теоретические положения Управление экраном в текстовом режиме в ms dos
- •Основные функции работы в текстовом режиме
- •2.5. Функции Определение функций.
- •Функция для вычисления объема цилиндра.
- •Функция для вычисления скалярного произведения векторов.
- •Обращение к функции и ее прототип.
- •Вычисление объема цилиндра
- •Вычисление площади треугольника.
- •Скалярное произведение векторов.
- •Препроцессорные средства
- •Глава 6. Структуры и объединения
- •6.1. Структурные типы и структуры Производные типы.
- •Структурный тип.
- •Определение структур.
- •Выделение памяти для структур.
- •Инициализация и присваивание структур.
- •Доступ к элементам структур.
- •Модули:
- •Некоторые понятия:
7.2.2. Чтение и запись данных
Ввод-вывод данных на нижнем уровне осуществляется функциями геаd( ) и write( ). Прототипы этих функций имеют следующий вид:
int read(int fd, char *buffer, unsigned int count);
int write(int fd, char *buffer, unsigned int count);
Обе функции возвращают целое число - количество действительно прочитанных или записанных байтов.
Функция read( ) читает количество байтов, заданное третьим параметром count, из файла, открытого с дескриптором файла fd, в буфер, определенный указателем buffer. При достижении конца файла функция read( ) возвращает значение 0. В случае возникновения ошибки при чтении из файла функция read( ) возвращает значение -1.
Операция чтения, так же как и для потокового ввода-вывода, начинается с текущей позиции в файле. После завершения операции чтения текущая позиция будет определять первый непрочитанный символ.
Если файл открыт в текстовом режиме, то происходят точно такие же преобразования при вводе последовательности символов CR и LF в символ '\n' (LF), как и при работе с потоком. Указанное преобразование приводит к тому, что в возвращаемом значении вместо двух символов CR и LF учитывается только один символ '\n' (LF).
Функция write( ) записывает последовательность байтов, количество которых задано третьим параметром count, в файл, открытый с дескриптором файла fd, из буфера, определенного указателем buffer. Запись производится с текущей позиции. Если файл открыт в текстовом режиме, то количество реально записанных байтов может превышать count за счет преобразований всех символов V в последовательности символов CR, LF. Таким образом, count будет содержать только количество символов, взятых из буфера.
Если при выполнении операции записи возникла ошибка, то функция write( ) возвращает значение -1, а глобальная переменная errno получает одно из следующих значений, заданных предопределенными константами в заголовочном файле errno.h:
EACCES - файл защищен для записи (доступен только для чтения);
ENOSPC - исчерпано свободное пространство на внешнем устройстве;
EBADF - недействительный дескриптор файла.
Приведем два примера применения функций низкоуровневого ввода-вывода.
Пример 1 .
Копирование последовательности отдельных символов из стандартного ввода в стандартный вывод:
В текст программы включается заголовочный файл io.h, содержащий прототипы функций read( ) и write( ). При вызове этих функций для файлов стандартного ввода и стандартного вывода используются соответственно значения дескрипторов стандартных файлов 0 и 1. Прочитанный символ и код клавиши <Enter>, который служит признаком завершения набора вводимой последовательности символов, записываются в одномерный массив с[ ] из 2 байтов, откуда они затем функцией write( ) выводятся на экран дисплея.
Запустив программу на выполнение, можно вводить одиночные символы с клавиатуры, завершая ввод каждого из них нажатием на клавишу <Enter>. Результат работы программы может выглядеть так:
Первый символ из пары одинаковых символов (v-v; w-w и т.д.) - это символ, введенный с клавиатуры и выведенный системой ввода-вывода на экран (стандартный режим ввода данных с клавиатуры). Второй символ пары выведен на устройство стандартного вывода функцией write( ). Программа копирования завершает работу при вводе сигнала прерывания (одновременном нажатии клавиш <Ctrl> и <С>).
Пример 2.
Копирование произвольного файла
Программа получает имена файлов из командной строки при запуске и позволяет копировать произвольные файлы, (см. аналог этой программы в §7.1.3).
Константа BUFSIZ (размер буфера для потокового ввода-вывода) определена в заголовочном файле stdio.h. Ее значение для MS-DOS равно 512 байт.
Для применения этой программы в ОС MS-DOS необходимо вначале построить исполняемую программу (см. гл. 9), например, copyf.exe. Вызов программы из командной строки будет иметь вид:
где -файл-источник;
- файл-приемник.
Если ошибок при исполнении программы нет, файл будет скопирован, но никаких сообщений на экране дисплея не появится.