Форматирование данных с помощью флагов. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Форматирование данных с помощью флагов.



Флаги Положение Умолчание Описание действий при установленном бите
skipws 0x0001 + при извлечении пробельные символы игнорируются
test 0x0002   выравнивание по левому краю
right 0x0004 + выравнивание по правому краю
internal 0x0008   знак числа выводится по левому краю, а число по правому. Промежуток заполняется символами Х (по умолчанию – пробелами)
dec 0x0010 + десятичная система счисления
oct 0x0020   восьмеричная
hex 0x0040   шестнадцатеричная
showbase 0x0080   вывод основания системы счисления: – шестнадцатеричная 0 – восьмеричная
showpoint 0x0100   при выводе вещественных чисел печатает десятичную точку и дробную часть
uppercase 0x0200   при выводе использует символы верхнего регистра
showpos 0x0400   печатает знак при выводе положительных чисел
scientific 0x0800   печатает веществ числа в форме мантиссы с порядком
fixed 0x1000   печатает вещественные числа в форме с фиксированной точкой, точность определяется полем precision
unitouf 0x2000   выгружает буферы всех потоков после каждого вывода
stdio 0x4000   выгружает буферы из потоков stdout и stderr после каждого вывода

Флаги

1) left, right, internal

2) dec, oct, hex

3) scientific, fixed

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

Для управления флагами в классе ios есть методы: flags, setf, unsetf.

· longios::flags(); - возвращает текущие флаги потока

· longios::flags(long); - присваивает флагам значения параметров

· longios::setf(long long); - присваивает флагам, биты которых в первом параметре, соответствующие значения во втором

· longios::setf(long); - устанавливает флаги, биты которых установлены в параметре

· longios::unsetf(long); - сбрасывает флаги, биты которых установлены в параметрах

 

Кроме флагов для форматирования используются следующие поля классов ios:

· int x_width – минимальная ширина поля ввода

· int x_precision – количество цифр в дробной части при выводе вещественных чисел с фиксированной точкой, либо общее количество значащих цифр при выводе числа с мантиссой и порядком

· int x_fill – символ заполнения поля ввода.

Для управления этими полями, используются методы width, precision, fill.

Int ios:: width()

возвращает значение ширины поля ввода

Int ios:: width(int)

устанавливает значение ширины поля ввода в соответствии с параметром

Int ios:: precision()

возвращает значение точности представления при выводе вещественного числа

Int ios:: precision(int)

устанавливает значение точности представления при выводе вещественного числа и возвращает старое значение точности

Char fill()

возвращает текущий символ заполнения

Char fill(char)

устанавливает значение текущего символа заполнения и возвращает старое значение символа.

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

adjustfield (left | right | internal);

basefield(dec |oct | hex);

floatfield(scientific | fixed);

Пример 1

Пример форматирования при выводе с помощью флагов и методов:

#include<iostream.h>

Int main()

{

long a = 1000, b = 077;

cout.width(7);

cout self(ios::hex| ios::showbase| ios::uppercase);

cout << a;

cout width(7);

cout<< b << endl;

double d=0.12, c=1.3*d-4;

cout self(ios::left);

cout << d << endl;

cout << c;

return 0;

}


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

Манипуляторы можно разделить на две группы: простые и параметризированные.

Простые манипуляторы не требуют указания аргументов, а параметризованные – требуют.

Простые манипуляторы

· dec – простой манипулятор, устанавливающий при вводе/выводе флаг десятичной системы счисления.

· oct – простой манипулятор, устанавливающий при вводе/выводе флаг восьмеричной системы счисления.

· hex – простой манипулятор, устанавливающий при вводе/выводе флаг шестнадцатеричной системы счисления.

· ws – устанавливает при вводе/выводе извлечение пробельных символов

· endl – при выводе включает в поток символ новой строки и выгружает буфер

· ends – при выводе включает в поток нулевой символ

 

Изменение системы счисления действует до следующего явного изменения. Параметризованный манипулятор требует указания аргумента, для его использования требуется подключить заголовочный файл <iomanip>

· setbase(int n) – задает основание системы счисления;

· resetiosflags(long) – сбрасывает флаги состояния поток, биты которых установлены в параметре.

· setiosflags(long) – устанавливает флаги состояния потока биты которых в параметре равны единице.

· setfill(int) – устанавливает символ заполнитель с кодом, равным значению параметра.

· setprecision – устанавливает максимальной количество цифр в дробной части для вещественных чисел в

· форме с фиксированной точкой, либо общее число значащих цифр для чисел в форме с мантиссой и

· порядком.

· setw(int) – устанавливает максимальную ширину поля вывода.

Пример 1

#include<iostream.h>

#include<iomanip.h>

Int main()

{

double d[] = {1.234, -12.34567, 123.456789, -1.234, 0.00001};

couy<<setfil('.')<<setprecision(4)<<setioflags(ios::showpoint| ios""fixed);

for(int i=0; i<5; i++)

cout << setw(12) << d[i] << endl;

return 0;

}

Результаты:

1.2340

-12.3457

123.458

-1.2340

0.0000


Методы обмена с потоками

В потоковых классах наряду с операторами извлечения из потока и включения в поток определены также методы для неформатированного чтения (неформатированного ввода) и записи в поток (неформатированного вывода). При этом преобразование данных не выполняется.

Функции чтения, определенные в классе istream:

· gcout – возвращает количество символов, считанных с помощью последней функции неформатированного ввода.

· get() – возвращает код извлеченного из потока символа или EOF.

· get(c) – возвращает ссылку на поток, из которого выполнялось чтение, и записывает извлеченный символ в c.

· get (buf, num, lim=) – считывает num-1 символов или пока не встретится символ lim и копирует их в символьную строку buf, вместо символа lim в строку записывается признак конца строки. Символ lim остается в потоке. Возвращает ссылку на текущий поток.

· getline(buf, num, lim =) – аналогична функции get(...) копирует в строку и символ lim.

· ignore(num = 1, lim = EOF) – считывает и пропускает символы до тех пор, пока не будет прочитано num символов или не встретится разделитель, заданный параметром lim. Возвращает ссылку на текущий поток.

· peek() – возвращает следующий символ без удаления его из потока или EOF, если достигнут конец файла

· putback(c) – помещает в поток символ с, который становится текущим при извлечении его из потока.

· read(buf, num) – считывает num символов, или все символы до конца файла, если их меньше num соответственно в символьный массив buf и возвращает ссылку на текущий поток.

· readsome(buf, num) – считывает num символов или все символы, если их меньше num в массив buf и возвращает количество символов.

· seekg (pos) – устанавливает текущую позицию чтения в значение pos.

· seekq (offs, org) – перемещает текущую позицию чтения на offs байтов, считая от одной из трех позиций, определенных вторым параметром (ios::cur – от текущей позиции, ios::end – от конца файла).

· tellq() – возвращает текущую позицию чтения потока.

· unget() – помещает последний прочитанный символ в поток и возвращает ссылку на текущий поток.

В классе ostream определены аналогичные функции для неформатированного вывода.

· flush(c) – описывает содержание потока выводя на физическое устройство.

· put(c) – выводит в поток символ с и возвращает ссылку на поток.

· seek(pos) – устанавливает позицию записи в значение pos.

· seek(offs, org) – перемещает текущую позицию записи на offs байтов, считая от одной из трех позиций, определенных вторым параметром (ios::beg, ios::cur, ios::end).

· tellq() – возвращает текущую позицию записи потока.

· write(buf, num) – записывает в поток num символов из массива buf и возвращает ссылку на поток.

 

Пример 1

Пример программы, считывающей строки из массива buf и возвращающей ссылку на поток:

#include<iostream.h>

Int main()

{

const int n=20, len = 100;

char str[len][n] int i =0;

while(cin, getline(str[i], len,)&&i<n)

{

...

i++;

}

return 0;

}

Пример 2

Пример программы, записывающей в файл число с плавающей точкой в строку символов. Программа осуществляет считывание из файла и вывод на экран.

#include<fstream.h>

#include<string.h>

Int main()

{

// запись в файл

ofstream out(“text”);

if(!out)

{

cout<<”cannot open file test for writing” << endl;

return 1;

}

double num = 100.45;

char str[]=” this is a test”;

out.write(reinterpret_cast<char *>(num), sizeof(double));

out.write (str, strlen(str));

out.close();

// чтение из файла

ifstream in(“test”, ios::n| ios::nocreate);

if(!in)

{

cout << “cannot open file test for reading” << endl;

return 1;

}

double check_num;

char check_str[60];

in.read(reinterpret_cast<char *> (& check_num), sizeof(double));

in.read(check_str, 60);

int lstr = in.ycout(); // количество прочитанных символов

check_str[lstr]=0; // занести нуль-символ в конец строки

cout << check_num << ‘ ‘ << check_str << endl;

in.close();

return 0;

}

Приведение типа reinterpret_cast <char *> при вызове функций write и read необходимо в тех случаях, когда параметр не является символьным массивом.

Пример 3

Пример программы, в которой формируется файл test, в который выводятся три строки:

#include<fstream.h>

#include<string.h>

Int main()

{

// запись в файл

ofstream out(“test”);

if(!out)

{

cout<<”cannot open file test for writing” << endl;

return 1;

}

char *str[] = {“line 1”, “line 2”, “line 3”};

for(int i=0; i<3; ++i)

{

out.write(str[i], strlen(str[i]));

out.put();

}

out.close();

// чтение файла

ifstream in(“test”, ios::in| ios::nocreate);

if(!n)

{

cout << “cannot open file test for reading” << endl;

return 1;

}

char check_str[3][60];

for(i=0; i<3; ++i)

{

in.get(check.str[], 60);

in.get();

}

// контрольный вывод

for(i=0; i<3; ++i)

cout << check_str[i] << endl;

in.close();

return 0;

}

После выполнения функции символ-разделитель остается во входном потоке, следовательно, необходим вызов функции get для пропуска одного символа. Альтернативный способ – использование функции getline, которая извлекает символ-разделитель из потока.


 

Классы с самоадресацией

Классы с самоадресацией - классы, которые содержат элемент-указатель, который указывает на объект того же типа класса:

Пример 1

Class Node

{

public:

Node(int);

void setdata(int);

int getdata() const;

void setnextptr(const Node *);

const Node * getnextptr() const;

private:

int data;

Node * nextptr;

};

Данное описание определяет тип класса Node – он имеет два закрытых элемента данных: целый элемент data и указатель nextptr, который указывает на объект типа Node, т.е. объект того же тип. Такие классы называются классами с самоадресацией. В них элемент nextptr используется как связывающий, т.е. nextptr может быть использован для связи объекта типа Node с объектом того же типа. У типа Node также имеется пять функций-элементов: конструктор, который принимает данные целого типа, для инициализации данных поля data; функция для установки значения data; функция getdata, возвращающая значение data: функция setnextptr для установки значения указателя nextptr, а также функция getnextptr, которая возвращает значение указателя nextptr. Объекты классов с самоадресацией могут связываться друг с другом, формируя абстрактные структуры данных: связные списки, очереди, стеки, деревья.

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

Типичная ошибка: указатель связи в последнем узле не установлен на ноль.


 

Глава 13. Взаимосвязь и различия C и C++



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 60; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.204.208 (0.062 с.)