Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Форматирование данных с помощью флагов.
Флаги 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 с.) |