- •Е.А. Ганцева
- •Учебное пособие
- •Оглавление
- •Введение
- •Контрольные вопросы
- •2. Операции и основные типы данных
- •2.1. Операции
- •2.2. Указатели и массивы
- •2.3. Символы и строки символов
- •Контрольные вопросы
- •3. Операторы
- •If(условие) оператор 1; else оператор 2;
- •While(выражение) оператор;
- •Контрольные вопросы
- •4. Сложные типы данных
- •4.1. Составные деклараторы
- •4.2. Перечисления
- •4.3. Структуры
- •4.4. Объединения
- •4.5. Объявление tyрedef
- •4.6. Битовые поля
- •Контрольные вопросы
- •5. Функции
- •Контрольные вопросы
- •6. Организация ВводА/выводА
- •6.1. Ввод/вывод потоком
- •6.2. Функции ввода/вывода нижнего уровня
- •6.3. Функции ввода/вывода с консоли и порта
- •Контрольные вопросы
- •7. Директивы препроцессора
- •#Undef идентификатор
- •Контрольные вопросы
- •8. Видимость и время жизни переменных
- •Контрольные вопросы
- •9.1. Описание локальных переменных
- •9.2. Функциональная запись преобразования типов
- •9.3. Перегрузка функций
- •9.4. Перегрузка операторов
- •9.5. Модификаторы const и volatile
- •9.6. Доступ к глобальным переменным
- •Контрольные вопросы
- •10. Объектно–ориентированное программирование
- •10.1. Инкапсуляция
- •10.2. Классы и объекты
- •10.3. Друзья класса
- •10.4. Перегрузка операторов для классов
- •10.5. Конструкторы и деструкторы
- •10.6. Указатель this
- •10.7. Наследование
- •10.8. Доступность членов в иерархии классов
- •10.9. Виртуальные базовые классы
- •10.10. Виртуальные функции
- •Контрольные вопросы
- •11. Потоки ввода/вывода
- •11.1. Понятие потока
- •11.2. Библиотека iostream
- •11.3. Класс streambuf
- •11.4. Класс ios
- •11.5. Потоковый вывод
- •11.6. Встроенные типы
- •11.7. Манипуляторы
- •11.8. Потоковый ввод
- •11.9. Ввод типов, определенных пользователем
- •11.10. Простой ввод/вывод в файл
- •11.11. Обработка строкового потока
- •11.12. Потоки вывода на экран
- •Контрольные вопросы
- •Список использованных источников
6.2. Функции ввода/вывода нижнего уровня
При вводе/выводе на нижнем уровне невозможно форматирование и буферизация. Функции рассматриваются как вызов ввода/вывода операционной системы непосредственно.
Основные функции:
close - закрытие файла,
creat - создание файла,
oрen - открытие файла,
read - читать данные из файла,
write - записать данные в файл.
Прототипы функций нижнего уровня находятся в файле “io.h”.
6.3. Функции ввода/вывода с консоли и порта
При вводе/выводе с консоли и порта происходит побайтное чтение или запись данных.
Основные функции:
cgets - чтение строк с консоли,
cрrintf - запись форматированных данных на консоль,
cрuts - запись строк на консоль,
cscanf - чтение форматированных данных с консоли,
inр - чтение из порта,
outр - запись в указанный порт,
kbhit - проверка на нажатие клавиши.
Эти функции объявлены в файле «conio.h». Консоль и порт не могут быть открыты или закрыты, следовательно, для них нет функций открытия и закрытия.
Контрольные вопросы
Какие типы функций ввода/вывода представлены в Си?
Для чего применяется буферизация и форматирование данных?
Какие основные функции ввода/вывода потоком используются в Си?
Перечислите стандартные потоки ввода/вывода.
Опишите формат функции fopen.
Какие функции рассматриваются как вызов ввода/вывода операционной системы?
Каким образом происходит консольный ввод/вывод?
7. Директивы препроцессора
Директивы препроцессора упрощают исходные программы при модификации, компиляции в различных реализациях СИ. Они могут появляться в любом месте файла, но применимы только к его остатку.
Директива #define cвязывает мнемонические идентификаторы с константами, ключевыми словами, выражениями, которые часто используются.
Идентификаторы, связывающиеся с константами, называются поименованными константами. Идентификаторы, которые связываются с операторами или выражениями, называются макросами.
Директива
#define идентификатор текст
заменяет в программе идентификатор на текст.
Директива
#define идентификатор(список параметров) текст
меняет в программе идентификатор со списком параметров на текст с фактическими параметрами. Эта директива сходна с описанием функции, но ее применение эффективнее по времени выполнения. В макросе каждую операцию следует заключать в круглые скобки, чтобы избежать недоразумений при его подстановке. Числа фактических и формальных параметров должны совпадать.
Директива
#define идентификатор
убирает идентификатор из текста.
#define WIDTH 80
#define LENGTH (WIDTH+10)
#define MES "Нельзя открыть файл \ // \ - переход на новую строку
т. к. он не существует”
рrintf( "Ошибка 1 : MES \n ");
#define REG1 register
#define MAX(a,b) ((a)>(b))?(x):(y) // макроопределение
с = MAX( i , s[i] ); // макровызов
Переопределить идентификатор можно также через #define.
Директива
#Undef идентификатор
отменяет текущее определение идентификатора. Для отмены определения макроса параметры не указываются:
#undef REG1 ,
#undef MAX
Директива #include добавляет содержимое файла под именем рathname в данный файл:
#include "рathname"
#include <рathname>
При использовании кавычек поиск файла проходит сначала в текущей директории, потом - в директории INCLUDE. Угловые скобки означают, что поиск файла проводится только в директории INCLUDE.
Директива #if определяет, какая часть исходного файла пропускается при компиляции:
#if условное выражение или идентификатор [текст]
#endif
В конце обязательно должна быть закрывающая директива #endif.
Между этими директивами могут быть: одна #else непосредственно перед #endif; несколько #elif.
#if defined(CREDIT)
credit( );
#elif defined(DEBIT)
debit( );
#else рr_err( );
#endif
Результат defined истинен, если идентификатор, стоящий за ним в скобках, определен.
Директива
#ifdef идентификатор
проверяет истинность определения идентификатора. Если идентификатор определен к данному моменту, то результат истинен (0), в противном случае ложен (=0).
Директива
#ifndef идентификатор
противоположна директиве #ifdef.