Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Ввод/вывод для типов данных, определенных пользователем




Реальное преимущество потоков С++ заключается в легкости, с которой можно совместить >> и << для управления вводом/выводом пользовательских типов данных. Рассмотрим простую структуру данных, которую можно объявить:

struct emp

{char *name;

int dept;

long sales;

};

Чтобы совместить << для вывода объектов типа emp, необходимо следующее определение:

ostream& operator << (ostream& str, emp& e)

{str << setw(25) << e.name << ": Отдел " << setw(6) << e.dept << tab << "З.П. " << e.sales << " р." << '\n';

return str;}

Функция-оператор << должна возвращать ostream&, ссылку на ostream, так что можно подсоединить новую функцию << подобно предварительно определенному оператору вставки. Теперь можно вывести объекты типа emp следующим образом:

#include <iostream.h>

#include <iomanip.h>

...

emp jones = {"Иванов", 25, 1000};

cout << jones;

//получив вывод на дисплей

//Иванов: Отдел 25 З.П. 1000 р.

Форматируемый вывод

Форматирование позволяет определить для каждого активного потока систему исчисления для преобразования (десятичная, восьмеричная и шестнадцатеричная), заполнение слева или справа, формат с плавающей запятой (научный или фиксированный) и будут ли пропускаться при вводе пробелы. Другие параметры, которые можно изменять, включают ширину поля (для вывода) и символ, используемый для заполнения. Эти флаги можно проверять, устанавливать, очищать с помощью различных функций элементов.

Манипуляторы

Наиболее изящный способ установки флагов формата (и выполнения других функций для потока) использует специальный механизм, известный как манипуляторы. Подобно операторам << и >> манипуляторы (это дерективы) могут включаться в цепочку операторов потока:

cout << setw(7) << dec << i << setw(6) << oct << j;

Параметризованный манипулятор setw принимает один аргумент типа int, чтобы установить ширину поля.

Непараметризованные манипуляторы, например, dec, oct и hex устанавливают систему исчисления для преобразования: десятичную, восьмеричную и шестнадцатеричную. В вышеприведенном примере int i будет выводится на экран в десятичном виде в поле шириной 7; int j будет выводится на экран в восьмеричном виде в поле шириной 6.

Ввод-вывод двоичных данных

Для ввода-вывода двоичных данных используются функции (методы классов ostream и istream) put, write и get, которые определены следующим образом:

ostream& ostream::put(char ch); //посылает ch в ostream

ostream& ostream::write(const char* buff, int n); //посылает n символов из buff в ostream;

Put и write позволяют выводить неформатированные двоичные данные в объект ostream. Put выводит один символ, а write может послать любое количество символов из указанного буфера.

Обычное извлечение строки не будет работать до тех пор, пока строка не будет завершена нулем.

Входная версия put называется get:

char ch;

cin.get(ch); //захватывает следующий символ из cin независимо от того пробел это или нет

Другая версия get позволяет захватывать любое количество необработанных, двоичных символов из istream до заданного максимума и помещать их в заданный буфер (так же, как и в случае с write, файлы должны быть открыты в двоичном режиме):

istream& istream::get(char *buff, int max, int term='\n');//читает символы до максимального количества из istream, а//затем помещает их в buff. Прекращает чтение, если//прочитан символ, указанный в term.

Можно установить term равным определенному конечному символу (по умолчанию — это символ новой строки), в котором get будет прекращать работу, если он будет достигнут прежде, чем max символов будет передано в buff.

Ввод/вывод с диска

Библиотека iostream включает много классов, порожденных из streambuf, ostream и istream, предоставляя, таким образом, широкий выбор методов ввода/вывода файлов. Класс filebuf например, поддерживает ввод/вывод через дескрипторы файлов с помощью функций элементов для открытия, закрытия и поиска.

Наиболее часто используемыми классами являются ifstream (порожденный из istream), ofstream (порожденный из ostream) и fstream (порожденный из iostream). Все они поддерживают форматированный файл ввода/вывода, используя объекты filebuf.

Шаблоны функций и шаблоны классов.

Шаблоны функций

Создание совместно используемых функций, средства предроцессирования много и неправильно работает.

Шаблон функции позволяет определять семейство функций. Это семейство характеризуется общим алгоритмом, который может применяться к данным различных типов. При этом задание конкретного типа данных для очередного варианта функции обеспечивается специальной синтаксической конструкцией, называемой списком параметров шаблона функции. Объявление функции, которому предшествует список параметров шаблона, называется шаблоном функции.

Объявление и определение шаблона функции начинается ключевым словом template, за которым следует заключенный в угловые скобки и разделенный запятыми непустой список параметров шаблона. Эта часть объявления или определения обычно называется заголовком шаблона.

Каждый параметр шаблона состоит из служебного слова class, за которым следует идентификатор. В контексте объявления шаблона функции служебное слово class не несет никакой особой смысловой нагрузки. Дело в том, что аналогичная конструкция используется также и для объявления шаблона класса, где, ключевое слово class играет свою особую роль. В заголовке шаблона имена параметров шаблона должны быть уникальны.

Следом за заголовком шаблона располагается прототип или определение функции — все зависит от контекста программы. Как известно, у прототипа и определения функции также имеется собственный заголовок. Этот заголовок состоит из спецификатора возвращаемого значения (вполне возможно, что спецификатором возвращаемого значения может оказаться идентификатор из списка параметров шаблона), имя функции и список параметров. Все до одного идентификаторы из заголовка шаблона обязаны входить в список параметров функции. В этом списке они играют роль спецификаторов типа. Объявления параметров, у которых в качестве спецификатора типа используется идентификатор из списка параметров шаблона, называется шаблонным параметром. Наряду с шаблонными параметрами в список параметров функции могут также входить параметры основных и производных типов.

Шаблон функции служит инструкцией для транслятора. По этой инструкции транслятор может самостоятельно построить определение новой функции.

Параметры шаблона в шаблонных параметрах функции обозначают места будущей подстановки, которую осуществляет транслятор в процессе построения функции. Область действия параметров шаблона ограничивается шаблоном. Поэтому в различных шаблонах разрешено использование одних и тех же идентификаторов-имен параметров шаблона.

В качестве примера рассмотрим программу, в которой для определения минимального значения используется шаблон функции min().

template <class Type>

Type minimum (Type a, Type b); /*Прототип шаблона функции.

Ключевое слово template обозначает начало списка параметров шаблона. Этот список содержит единственный идентификатор Type. Сама функция содержит два объявления шаблонных параметра, специфицированных шаблоном параметра Type. Спецификация возвращаемого значения также представлена шаблоном параметра Type. */

int main (void)

{minimum (10,20);// int minimum (int, int);

minimum (10.0,20.0);// float minimum (float, float);

return 1;

}

template <class Type>

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...