7. Строковые классы Си++. Потоки ввода-вывода (972461)
Текст из файла
Кафедра Компьютерных методов физики: программирование, первый курс, второй семестрЯзык программирования Си++Иванов А.П., Князева О.С.Семинар 7. Строковые классы Си++. Потоки вводавывода.1. Строковые классы Си ++Строковый шаблонный класс STL и его наиболее употребимые специализации(инстанцирования) определены в заголовочном файле <string>. Предназначен этот класс,главным образом, для удобной работы с текстовыми строками, однако, так как этот классшаблонный, то он может использоваться и для реализации строк, состоящих не только изсимволов типа char.Конечно, что-то похожее можно было бы реализовать и на основе vector<char>, однако,реализация отдельного шаблона позволила решить следующие задачи:расширенный набор функций, аналоги которых были определены в языке Си:поиск, сравнение, копирование строк и т.п.;более экономная реализация, позволяющая избежать лишних копирований иаллокаций памяти по сравнению с классом vector (тактика copy-on-write).Основной шаблонный класс, в котором сосредоточена вся функциональность:template <class CharType,class Traits=char_traits<CharType>,class Allocator=allocator<CharType>>class basic_string;Важнейший параметр шаблона – первый, он определяет, какой тип будет сохраняться вданном контейнере.
Два других параметра имеют значения по умолчанию и, как правило,задаются явно только в очень специальных случаях.Определения производных типов (специализация)stringспециализация basic_string<char>, представляющая собой строку изобычных символов.wstringспециализация basic_string<wchar_t>, представляющая собой строку изобычных символов в двухбайтовой кодировке Unicode.ОператорыЧасть операторов реализована как внеклассовые шаблонные функции, а другая часть – какчлены класса basic_string.operator[]Возвращает ссылку (которой можно присваивать значение) на символстроки, имеющий указанный номер по порядку от начала.operator=Оператор присваивания строке, имеет несколько разных реализаций по14.11.20111Кафедра Компьютерных методов физики: программирование, первый курс, второй семестртипу аргумента: присваивание другой строки, одиночного символа и листроки языка Си типа char*.operator+operator+=Добавление второй строки в конец первой.
Аналогично операторуприсваивания – допускает аргументы разных типов (Си++ строка,Си строка, одиночный символ).operator!=operator==operator<operator<=operator>operator>=Операторы сравнения двух строк.operator<<operator>>Операторы ввода и вывода строки в поток (например, cin или cout).Отдельная функцияgetlineПозволяет читать входной поток (такой, как cin) построчно, присваиваеточередную считанную строку указанной переменной:string s1;cout << "Enter a sentence:" << endl << flush;getline(cin,s1);Определения типов, встроенные в классiteratorconst_iteratorАналогично прочим STL-контейнерам, со строкой можнооперировать при помощи итераторов (обобщения указателей).nposСпециальный тип (эквивалентный значению целочисленной«минус единице»), предназначенный для сигнализации о неуспехепоиска в строке.Конструкторыbasic_stringКонструкторы, в зависимости от типа своего аргумента позволяютсоздать строку из строки Си, другой Си++ строки, одиночногосимвола или заданного их количества, а также – создать пустуюстроку.Member Functionssize, lengthВозвращают текущее количество символов в строке.emptyПроверка на пустую строку.resizereserve14.11.2011Изменение размера строки: в зависимости от соотношения старогои нового размеров либо уничтожаются лишние символы в концестроки, либо специально указываемый символ добавляется внужном количестве в конец строки..Резервирует размер внутреннего буфера строки не менее, чем до2Кафедра Компьютерных методов физики: программирование, первый курс, второй семестрcapacityуказанного количества символов.Возвращает текущий размер зарезервированного внутреннегобуфера строки, который может быть использован под сохранение еесимволов без вызова методов аллокации памяти.assignappendАналогично operator= и operator+= присваивают или дописываютв конец данной строки – другую строку, однако, в отличие отсоответствующих операторов, содержат по нескольку вариантов сдополнительнымиаргументами,позволяющимивыполнитькопирование только части строки.atКак operator[] возвращает ссылку на символ строки с заданнымномером, однако, в отличие от него выполняет строгую проверкуиндекса на попадание в диапазон допустимых значений ивыставляет исключительное состояние в случае неуспеха.beginendВозвращают итераторы для позиций первого символа и символа,находящегося за последним значащим символом строки.c_strМетодвозвращаетуказательтерминированную символом '\0'.dataАналогичный метод, возвращает указатель на массив символов,соответствующей текущей строке, но без обязательноготерминирования их символом '\0'.eraseУдаляет из строки отдельный символ или диапазон символов,начиная с указанной позиции и указанной длины.clearУничтожает все символы строки, делает ее пустой.compareЛексикографическое сравнение двух строк.copyКопирует указанный диапазон символов строки во внешний массивсимволов.insertВставляет в указанной позиции одиночный элемент или диапазонсимволов.push_backДобавляет указанный символ в конец строки.replaceЗаменяет указанный символ или диапазон символов в строке.substrИзвлекает из строки подстроку указанной длины, начиная суказанной позиции.findИщет в строке указываемую подстроку.find_first_not_ofИщет в строке символ, не являющийся ни одним из указанных.find_first_ofИщет в строке символ, совпадающий с одним из указанных.14.11.2011наобычнуюСи-строку,3Кафедра Компьютерных методов физики: программирование, первый курс, второй семестрfind_last_not_ofИщет в строке последний символ, который не совпадает ни с однимиз указанных.find_last_ofИщет в строке последний символ, совпадающий с одним изуказанных.rfindПроводит в строке поиск от конца к началу указанной подстроки.2.
Потоки ввода-выводаВ качестве альтернативы к стандартной библиотеке ввода-вывода <stdio.h>, язык Си++предлагает объектно-ориентированный потоковый ввод-вывод. Для использования этойвозможности необходимо подключить к исходному тексту программы файл <iostream>.Аналогом стандартных файлов ввода-вывода в Си (stdin,stdout,stderr) служат потокиcin, cout, cerr. Эти потоки являются объектами классов, производных от istream дляпотоков ввода и ostream для потоков вывода. Существует так же определение классаiostream для потока ввода-вывода.Для осуществления операций ввода-вывода нужно воспользоваться переопределеннымиоператорами >> для операции ввода и << для вывода.#include <iostream>void main() {int n;cout << "Hello, world!\n" << "Enter number: ";cin >> n;cout << "\nYou entered: " << n;}Операции ввода-вывода определены для всех базовых типов.
При этом используетсяформат «по умолчанию», когда для вывода, например, числа плавающей арифметикипечатается полностью его текстовое представление с некоторым фиксированным числомзначащих цифр.Операторы вывода определены в классе ostream следующим образом:class ostream : {//...................................................ostream& operator<< (char);ostream& operator<< (int);ostream& operator<< (long);ostream& operator<< (float);ostream& operator<< (double);ostream& operator<< (const char *);//...................................................}Каждый такой оператор возвращает ссылку на текущий поток вывода. Это даетвозможность сцеплять несколько операций вывода в один оператор языка, сохраняяестественный порядок: вывод параметров будет осуществляться слева направо.14.11.20114Кафедра Компьютерных методов физики: программирование, первый курс, второй семестрНе следует забывать, что данные операторы имеют стандартный приоритет языка Си.Следовательно иногда для корректной записи необходимы скобки:int a,b, mask = 0x0F;cout << a+b << (a & mask) << " Correct!";Поток ввода реализован аналогичным образом.Для того, чтобы обеспечить вывод типов данных, введенных пользователем, надоопределить для них оператор вывода, например, следующим образом:class CDate {private:int day, month, year;public:CDate( int day_in, int month_in, int year_in );//...........................friend ostream& operator<<(ostream& s, CDate& date);};//.......................ostream& operator<<(ostream& s, CDate& date) {return s << date.day << "." << date.month << "." << date.year-2000;}//.......................CDate today(08,05,2010);cout << "\nToday = " << today;Результат:Today = 08.05.10Форматирование выводаПо сравнению с функцией printf() базовые потоки предоставляют гораздо меньшевозможностей по форматированию вывода.
Основное форматирование осуществляется спомощью функций-манипуляторов входными потоками.Основные манипуляторы:// Вставка в поток символа конца строки '\n' и сброс потокаostream& endl(ostream&);// Вставка в поток символа null для окончания строкиostream& ends(ostream&);// Сброс потока, выводятся все символы из внутреннего буфера.ostream& flush(ostream&);// В потоке ввода будут пропущены все пробельные символы:// (' ','\n','\r','\t'...)istream& ws(istream &);Следующие манипуляторы имеют действие до тех пор, пока в данном потоке не будетприменен другой манипулятор, отменяющий его действие:// Установка режима десятичного вывода целых чиселios& dec(ios &);14.11.20115Кафедра Компьютерных методов физики: программирование, первый курс, второй семестр// Установка режима шестнадцатиричного вывода целых чиселios& hex(ios &);// Установка режима восьмиричного вывода целых чиселios& oct(ios &);Примеры применения манипуляторов:cout << "Следующая строка напечатается с новой строки: " << endl <<"Шестнадцатиричное число: " << hex << 256 <<" Снова десятичное: " << dec <<256;Результат:Следующая строка напечатается с новой строки:Шестнадцатиричное число: FF Снова десятичное: 256Заметим, что мы не вызывали функцию-манипулятор явно, а передали лишь указатель нанее.Дополнительные манипуляторы определены в файле <iomanip>:// Установка режима восьмиричного вывода целых чисел:smanip_int setfill(int _f);// Установка ширины поля.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.