logo
Лабораторная работа 7new

Определенный пользователем вывод.

Вы можете перегрузить оператор << для вывода Ваших типов данных. Предположим, у Вас есть тип

struct info {

char *name;

double val;

char *units;

};

Вы можете перегрузить <<:

ostream& operator << (ostream& s, info& m) {

s << m.name << " " m.val << " " << m.units;

}

операторы

info x;

...

// инициализация х

...

cout << x;

будут выводить "capacity 1.25 liters".

Ввод.

Входной поток аналогичен выходному, но использует перегруженный оператор сдвига вправо >>, известный как оператор извлечения (получить из). Левый операнд >> - это объект типа класс и stream. Как и для вывода, правый оператор может быть любого типа, для которого был определен входной поток.

По умолчанию >> пропускает разделители (определенные функцией isspace в ctype.h), затем читает символы, соответствующие типу входного объекта. Пропуск разделителей управляется флагом ios::skipws в перечислении состояния формата. Флаг skipws обычно установлен на пропуск разделителей. Очистка этого флага (например через setf) выключает пропуск разделителей. Заметим так же, что манипулятор ws позволяет Вам удалить разделители.

Рассмотрим следующий пример:

int i;

double d;

cin >> i >> d;

Последняя строка приводит к пропуску разделителей; цифры, читаемые со стандартного ввода (по умолчанию с клавиатуры) затем преобразуются во внутреннюю двоичную форму и сохраняются в переменной i; пропускается больше разделителей, и, наконец, читается число с плавающей точкой, преобразуется и сохраняется в переменной d.

Для типа char (signed или unsigned) действие оператора >> заключается в том, что пропускается разделитель и запоминается следующий символ (не-разделитель). Если Вам нужно читать следующий символ, независимо от того, является ли он разделителем или нет, Вы можете использовать одну из элементов-функций get.

Для символа char* (рассматриваемого как строка), оператор >> пропускает разделитель и запоминает следующие символы (не-разделители) до тех пор, пока не встретится другой символ разделителя. Затем добавляется завершающий нулевой символ. Необходимо избегать "переполнения" строки. Можно изменить длину по умолчанию (0, означающий отсутствие предела) используя setw следующим образом:

char array[SIZE];

...

// инициализация массива

...

cin.width(sizeof(array));

cin >> array;

Для ввода со встроенными типами, если конец ввода происходит до появления любого символа не-разделителя, то в buf не запоминается ничего, а состояние istream устанавливается в "fail". Таким образом, если выход был не инициализирован, то он остается не инициализированным.