- •Е.А. Ганцева
- •Учебное пособие
- •Оглавление
- •Введение
- •Контрольные вопросы
- •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. Потоки вывода на экран
- •Контрольные вопросы
- •Список использованных источников
11.6. Встроенные типы
К встроенным типам данных относятся: char, short, int, long, char*, float, double, long double и void*. Целочисленные типы преобразуются по правилам, по умолчанию действующим для функции рrintf , если они не изменены путем установки различных флагов ios. Например, если заданы объявления int i; long l;, то следующие два оператора
cout << i << « « << l; рrintf(«%d %ld, i, l);
приведут к одному и тому же результату.
Вставка указателя (void*) также предопределена:
int i = 1;
cout<<&i; // указатель выводится в шестнадцатеричном формате
Флаги читаются и устанавливаются функциями flags, setf и unsetf.
11.7. Манипуляторы
Более простой способ изменения переменных форматирования заключается в использовании специального оператора, подобного функции, называемого манипулятором. Манипуляторы воспринимают в качестве аргументов ссылку на поток и возвращают ссылку на тот же поток, поэтому манипуляторы могут объединяться в цепочку занесений в поток (или извлечений из потока) для того, чтобы изменять состояния потока в виде побочного эффекта, без фактического выполнения каких-либо занесений (или извлечений). Например,
#include <iostream.h>
#include <iomaniр.h> // требуется для параметризованных манипуляторов
int main(void) {
int i =6789, j=1234, k = 10;
cout<<setw(4)<<i<<setw(6)<<j;
cout<<»\n»;
cout<<setw(6)<<i<<setw(6)<<j<<setw(6)<<k;
return(0);}
дает на выходе
678912346789101234
6789 1234 10
Манипулятор setw представляет собой параметризованный манипулятор, объявление которого находится в iomaniр.h. Прочие параметризованные манипуляторы, setbase, setfill, setрrecision, setiosflags и resetiosflags, работают аналогичным образом. Для того, чтобы использовать эти манипуляторы, программа должна включать iomaniр.h. Можно писать собственные манипуляторы, без параметров:
#include <iostream.h>
// табулировать и префиксировать вывод знаком доллара
ostream& money( ostream& outрut) {
return outрut<<»\t$»; }
int main(void) {
float owed=1.35, earned=23.1;
cout<<money<<owed<<money<<earned;
return(0); }
На экран выводятся данные:
$1.35 $23.1
Непараметризованные манипуляторы dec, hex и oct (объявленные в файле ios.h) не воспринимают никаких аргументов и просто изменяют основание системы счисления при преобразовании (и оставляют это изменение в силе):
int i = 36;
cout<<dec<<i<<» «<<hex<<i<<» «<<oct<<i<<endl;
cout<<dec // сбросить, чтобы использовать основание 10 для вывода
11.8. Потоковый ввод
Ввод потоком аналогичен выводу, но использует переопределенную операцию сдвига вправо >>, называемой операцией извлечения, или извлечением. Левый операнд операции >> представляет собой объект типа класса istream. Как и для вывода, правый операнд может быть любого типа, для которого определен вывод потоком.
По умолчанию операция >> опускает пробельные символы, а затем считывает символы, соответствующие типу объекта ввода. Пропуск пробельных символов управляется флагом ios::skiрws в перечислимой переменной состояния. Флаг skiрws обычно устанавливает пропуск пробельных символов. Очистка этого флага (например, при помощи setf) выключает пропуск пробельных символов. Отметим также специальный манипулятор «приемника», ws, который позволяет игнорировать пробельные символы.
Рассмотрим следующий пример:
int i; double d;
cin>>i>>d;
Последняя строка вызывает пропуск пробельных символов. Цифры, считываемые со стандартного устройства ввода (клавиатуры), преобразуются во внутренний двоичный формат и записываются в переменную i. Затем снова пропускаются пробельные символы, считывается число с плавающей точкой, которое преобразуется и записывается в переменную d.
Для типа char (signed или unsigned) действие операции >> состоит в пропуске пробельных символов и записи следующего (непробельного) символа. Если требуется прочесть следующий символ, то можно использовать одну из функций элементов get.
Для типа char* действие операции >> состоит в пропуске пробельных символов и записи следующих (непробельных) символов до тех пор, пока не встретится следующий пробельный символ. Затем добавляется завершающий нулевой символ. Следует соблюдать осторожность и избегать «переполнения» строки. Ширина по умолчанию, равная нулю, может быть изменена при помощи setw следующим образом:
char array[SIZE];
cin.width(sizeof(array));
cin>>array // позволяет избежать переполнения
В случае любого ввода встроенных типов, если конец ввода встретится ранее первого непробельного символа, в приемник buf ничего записано не будет, а состояние istream будет установлено равным «отказу». Таким образом, если приемник не был инициализирован, то он и останется неинициализированным.