Язык С++ для системного программирования. Имена-этикетки. Класс как область действия, страница 21

for(int I = Ø; I < N; I ++)

for(int j = Ø; j < M; j ++)

ifs>>x. x [ I ][ j ];/ * Допускается совпадение символических имен

элементов данных и параметров * /.

returnifs; //Не забывать!

}

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 */

matrq;

q = v + w; //вызывается оператор + ( ).

ofstream viv ("q. dan");

viv << q; //Вывод q в файл q.dan.

//Вызывается оператор << ( ).

}

25.1 Форматирование данных

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

25.2 Форматирующие функции-элементы

Функции для форматирования, имеющиеся в классе ios, перегружены, чтобы обеспечить возможность как чтения, так и установки управляющего атрибута. Часто для атрибутов, которыми можно управлять с помощью функций, библиотека потоков С++ предусматривает также МАНИПУЛЯТОРЫ. Ниже описываются атрибуты, для управления которыми в классе ios имеются функции-элементы.

25.2.1 Ширина поля

Для чтения и управления ширины поля потока в классе ios имеется функция width. Она перегружена : intios : .width ( ) возвращает текущее значение внутренней переменной ширины поля потока;

intios::width(int) устанавливает значение переменной ширины поля.

Дополнительная информация:

  • При вводе width может быть использованадля задания максимального числа читаемых символов.
  • Применяемая при выводе width задает минимальную ширину поля.
  • Если ширина поля меньше заданной, вывод дополняется символами fill. (Например, пробелами).
  • Если выходное поле больше указанного, значение width игнорируется.
  • По умолчанию значение width равно нулю (выход не дополняется и не обрезается).
  • widthобнуляется после каждого помещения данных в поток.

Примеры:

cin.width (MAX_LEN);

cout.width ( 4 );

25.2.2 Заполняющий символ

Для чтения или изменения текущего заполняющего символа можно применить функцию ios ::fill( ). Эта функция тоже перегружена.

charios ::fill( char ) - устанавливает внутренний заполняющий символ потока и возвращает его предыдущее значение.

По умолчанию заполняющим символом является пробел.

Пример: cout.fill (' * ');

25.2 3 Число цифр (точность) вещественных чисел

Функция ios::precision( ) применяется при выводе чисел с плавающей точкой, позволяя читать или устанавливать текущее число значащих цифр.

intios::precision( )- возвращает текущее значение точности.

intios::precision(int) - устанавливает внутреннюю переменную точности вещественных чисел потока и возвращает прежнее значение.

Дополнительная информация:

  • По умолчанию точность равна 6цифрам.
  • Если установлен флаг scientific илиfixed, то precision задает число цифр, выводимых после десятичной точки.

Если не установлен ни один из этих флагов, то precision задаёт общее число значащих цифр.

Примеры:

cout.precision (4); //Всего 4 цифры.
 
cout.setf (ios :: fixed, ios :: floatfield); //Установили флаг fixed.
 
cout.precision (4); //4 цифры // после десятичной точки.