Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000101.doc
Скачиваний:
8
Добавлен:
30.04.2022
Размер:
370.18 Кб
Скачать

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 будет установлено равным «отказу». Таким образом, если приемник не был инициализирован, то он и останется неинициализированным.