7. Строковые классы Си++. Потоки ввода-вывода (Семинары)
Описание файла
Файл "7. Строковые классы Си++. Потоки ввода-вывода" внутри архива находится в папке "Семинары". PDF-файл из архива "Семинары", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Кафедра Компьютерных методов физики: программирование, первый курс, второй семестрЯзык программирования Си++Иванов А.П., Князева О.С.Семинар 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);// Установка ширины поля.