Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 127; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.156 (0.01 с.) |