Перегрузка операций сдвига для файлового ввода/вывода
Осуществляется подобно рассмотренному ранее расширению потоков для типов, определяемых пользователем с использованием дружественных функций. Их заглавия имеют вид:
friend ifstream & operator >> (ifstream & ifs, имя класса & имя объекта);
friend ofstream & operator << (ofstream & ofs, имя класса & имя объекта);
Пример. Условия задачи такие же, как и в предыдущем примере, но складываемые матрицы находятся в одном файле v hod. dan.
Пусть конкретно находится серия матриц v [ 2 ] [ 3 ] и w [ 2 ] [ 3 ]. Их элементы последовательно записаны в файле v hod. dan. Например, в файле v hod. dan имеются следующие числа:
1 2 3
4 5 6
-1 -2 -3
-4 -5 -6
Первые две строки – элементы матрицы v, а вторые – матрицы w.
# include < iostream. h >
# include < fstream. h >
# include < stdlib.h >
# define N 2
# define M 3
class matr
{
float x [ N ] [ M ];
friend ifstream & operator >> (ifstream & ifs, matr & x);
friend ofstream & operator << (ofstream & ofs, matr & a);
friend matr operator + (matr & a, matr & b);
};
ifstream & operator >> (instream & ifs, matr & x)
{
for (int I = Ø; I < N; I ++)
for (int j = Ø; j < M; j ++)
ifs >>x. x [ I ] [ j ]; / * Допускается совпадение символических имен элементов данных и параметров * /.
return ifs; //Не забывать!
}
ofstream & operator << (ofstream & ofs, matr & a)
{
for (int I = Ø; I < N; I ++)
for (int j = Ø; j < M; j ++)
ofs << a. x [ I ] [ j ];
return ofs;
}
matr operator + (matr & a, matr & b)
{
matr v;
for (int I = Ø; I < N; I ++)
for (int j = Ø; j < M; j ++)
v. x [ I ] [ j ] = a. x [ I ] [ j ] + b. x [ I ] [ j ];
return v;
}
void main ( )
{
matr w, v;
ifstream fvh (“v hod. dan”);
fvh >> v >> w; // * Дважды вызывается оператор >>. Первой вводится матрица v, а за ней w */
matr q;
q = v + w; //вызывается оператор + ( ).
ofstream viv (“q. dan”);
viv << q; //Вывод q в файл q.dan.
//Вызывается оператор << ( ).
}
Лекция 25
Форматирование данных
Библиотека потоков С + + предусматривает три способа управления форматом выходных данных: вызов форматирующих функций – элементов, использование флагов и применение манипуляторов.
Форматирующие функции-элементы
Функции для форматирования, имеющиеся в классе ios, перегружены, чтобы обеспечить возможность как чтения, так и установки управляющего атрибута. Часто для атрибутов, которыми можно управлять с помощью функций, библиотека потоков С + + предусматривает также МАНИПУЛЯТОРЫ. Ниже описываются атрибуты, для управления которыми в классе ios имеются функции-элементы.
Ширина поля
Для чтения и управления ширины поля потока в классе ios имеется функция width. Она перегружена : int ios : .width ( ) возвращает текущее значение внутренней переменной ширины поля потока;
int ios :: width (int) устанавливает значение переменной ширины поля.
Дополнительная информация:
· При вводе widthможет быть использована для задания максимального числа читаемых символов.
· Применяемая при выводе width задает минимальную ширину поля.
· Если ширина поля меньше заданной, вывод дополняется символами fill. (Например, пробелами).
· Если выходное поле больше указанного, значение widthигнорируется.
· По умолчанию значение widthравно нулю (выход не дополняется и не обрезается).
· width обнуляется после каждого помещения данных в поток.
Примеры:
cin. width (MAX_LEN);
cout. width ( 4 );
Заполняющий символ
Для чтения или изменения текущего заполняющего символа можно применить функцию ios ::fill( ). Эта функция тоже перегружена.
char ios:: fill (char) – устанавливает внутренний заполняющий символ потока и возвращает его предыдущее значение.
По умолчанию заполняющим символом является пробел.
Пример: cout. fill (‘ * ’);
Число цифр (точность) вещественных чисел
Функция ios:: precision ( ) применяется при выводе чисел с плавающей точкой, позволяя читать или устанавливать текущее число значащих цифр.
int ios:: precision ( )- возвращает текущее значение точности.
int ios:: precision (int) – устанавливает внутреннюю переменную точности вещественных чисел потока и возвращает прежнее значение.
Дополнительная информация:
· По умолчанию точность равна 6цифрам.
· Если установлен флаг scientific или fixed, то precision задает число цифр, выводимых после десятичной точки.
Если не установлен ни один из этих флагов, то precision задаёт общее число значащих цифр.
Примеры:
cout. precision (4); //Всего 4 цифры.
cout. setf (ios :: fixed, ios :: floatfield); //Установили флаг fixed.
cout. precision (4); //4 цифры // после десятичной точки.
Флаги форматирования
В потоках С + + имеются флаги форматирования. Они задают, каким образом форматируется ввод и вывод. Флаги являются битовыми полями, хранящимися в переменной типа long. Одной из функций, используемых для установки флагов, является setf ( ). Она перегружена. Один из ее заголовков имеет вид
long ios :: setf (long);
Она устанавливает флаги, биты которых установлены в параметре, и возвращает прежнее значение всех флагов.
Функция long ios :: unsetf (long) сбрасывает флаги, биты которых установлены в параметре; возвращает прежнее значение всех параметров.
При установке можно указывать несколько флагов, разделяя их вертикальной чертой.
Например,
cout. setf (ios :: showbase | ios :: hex);
cout. seft (ios :: fixed);
Некоторые флаги формата
ios :: right – данные при выводе выравниваются по правой границе поля.
ios :: dec, ios :: oct, ios :: hex – числа выводятся соответственно в «10», «8» или «16» системах исчисления.
ios :: showbase – при выводе чисел добавляется индикатор основания (Ø х для 16-ричных и Ø для 8-ричных).
ios :: fixed, ios :: scientific – вещественные числа выводятся соответственно с фиксированной или плавающей точкой.
ios :: uppercase – буквы от А до F в 16-ричных числах выводятся в верхнем регистре.
25.3 Манипуляторы.
Это функции, которые можно включать в цепочку последовательных операций помещения и извлечения. Это удобный способ управления флагами потока.
Однако применение манипуляторов не ограничивается модификациями формата ввода/вывода.
За исключением setw, изменения, внесенные манипуляторами, сохраняются до следующей установки.
Простые манипуляторы
Манипуляторы, не требующие указания аргументов, называются простыми. Наиболее часто употребляются следующие предопределенные простые манипуляторы:
endl– помещает в выходной поток символ новой строки (\’ n’) и вызывает
манипулятор flush. Применяется перед вводом символа или символьной строки.
еnds – помещает в выходной поток нулевой символ (‘\ Ø’). Обычно используется для указания конца строки.
flush – принудительно записывает все выходные данные на соответствующие физические устройства.
dec, oct, hex – устанавливают соответственно «10», «8», «16» системы счисления.
Примеры:
cout <<”hex x =” << hex << x <<’ \ n’;
Значение х выводится в 16-ричной системе.
cout <<”oct x = ” << oct << x <<’ \ n’;
Вывод х в 8-ричной системе.
char name [2Ø];
cout << ”Введите имя” <<endl;
cin >> name;
Здесь перед вводом строки символов используется манипулятор endl.
Параметризованные манипуляторы
Требуют спецификации аргументов. Некоторые из них приведены ниже.
setbase (int _ b) – задает основание преобразования.
setfill (int _ f) – задает заполняющий символ.
setprecision (int _ n) – задает значение внутренней переменной n точности
вещественных чисел.
setw (int _ w) – задает ширину поля.
25.4 Шаблоны С + +
Шаблоны позволяют давать обобщенные в смысле произвольности используемых типов определения классов и функций. Эти определения служат компилятору основой для классов или функций, создаваемых для конкретного типа данных. Шаблоны часто называют параметризованными типами. Они позволяют компилировать новые классы или функции, задавая типы в качестве параметров. Имеются шаблоны классов и шаблоны функций. Более часто используются шаблоны функций, которые и будут рассмотрены ниже.
Шаблоны функций
При написании программы на С + + может возникнуть необходимость создать несколько функций, которые выполняют одни и те же действия, но с данными разных типов. Например, нужно создать функции, определяющие максимальные элементы для массивов int и double. Или выполнять сортировку элементов массивов разных типов и т.д. В этих случаях удобно написать шаблон функции, по которому компилятор самостоятельно создает функцию для каждого из типов данных. При определении шаблона функции будут использоваться формальные типы данных, а при обращении к шаблону будут указываться соответствующие фактические типы данных.
Синтаксис шаблона функции имеет вид:
template<список_формальных_типов_шаблона>
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|