c++ Базовый. Занятие 12

22
Модуль 3 : Основные понятия объектно-ориентированного программирования. Темы лекции : Строки. Потоки ввода-вывода. Практическое задание : Ввод-вывод в С++. Тренер: Игорь Шкулипа, к.т.н. C++ Базовый. Занятие 12

Upload: igor-shkulipa

Post on 21-Mar-2017

57 views

Category:

Education


0 download

TRANSCRIPT

Модуль 3: Основные понятия объектно-ориентированного программирования.

Темы лекции: Строки. Потоки ввода-вывода.

Практическое задание: Ввод-вывод в С++.

Тренер: Игорь Шкулипа, к.т.н.

C++ Базовый. Занятие 12

http://www.slideshare.net/IgorShkulipa 2

Строки в C++

http://www.slideshare.net/IgorShkulipa 3

Строки в C++

Для работы со строками в С++ используются классыбиблиотеки STL.

Включаемый файл <string> содержит описания двух классовстрок, первый с символами типа char (однобайтовыесимволы), второй с символами типа wchar_t (двухбайтовые

символы)

typedef basic_string <char> string;

typedef basic_string <wchar_t> wstring;

http://www.slideshare.net/IgorShkulipa 4

Доступ к элементу строки и добавление в конец строки

Доступ к элементу строки

⚫ at(size_type pos) const - доступ к символу в позиции pos;

⚫ reference at(size_type pos) - доступ к символу в позиции pos.

Если генерация исключения не нужна при некорректном аргументе pos, томожно воспользоваться операцией [].

Добавление в конец строки

⚫ append(const basic_string& s) – добавление строки;

⚫ append(const basic_string& s, size_type pos, size_type npos) -

добавление части строки;

⚫ append(const char* s) - добавление C-строки;

⚫ append(const char* s, size_type n) - добавление части C строки;

⚫ append(size_type n, char c ) - добавление n символов c;

⚫ append(InputIterator first, InputIterator last) - добавление строки

заданной итераторами.

Методы возвращают ссылку на себя (*this). В качестве альтернативыметодам с одним аргументом можно воспользоваться операцией +=.

http://www.slideshare.net/IgorShkulipa 5

Присваивание данных строке

Присваивание данных строке

⚫ assign(const basic_string& s) – присваивание строки;

⚫ assign (const basic_string& s,size_type pos, size_type n) -

присв. части stl строки;

⚫ assign (const char* s) - присваивание C-строки;

⚫ assign (const char* s, size_type n) - присваивание части C-

строки;

⚫ assign (size_type n, char c) - присваивание n символов c;

⚫ assign (InputIterator first, InputIterator last) -

присваивание строки заданной итераторами.

Методы возвращают ссылку на себя (*this). В качестве альтернативыметодам с одним аргументом можно воспользоваться операцией =.

http://www.slideshare.net/IgorShkulipa 6

Методы сравнения строк

Сравнение строк

⚫ compare (const basic_string& str) - сравнение с stl строкой;

⚫ compare (size_type pos1, size_type n1, const basic_string&

str) const - сравнение с частью stl строки;

⚫ compare (size_type pos1,size_type n1,const basic_string&

str,size_type pos2,size_type n2) const - сравнение части stl

строки с частью stl строки;

⚫ compare (char* s) const - сравнение с C-строкой;

⚫ compare (size_type pos, size_type n1, char* s) const -

сравнение с C-строкой;

⚫ compare (size_type pos, size_type n1, char* s, size_type n2)

const - сравнение с C-строкой.

Методы сравнения возвращают следующие значения:

⚫ 0 - строки равны;

⚫ <0 - строка лексиграфически меньше со сравниваемой строкой;

⚫ >0 - строка лексиграфически больше со сравниваемой строкой.

В качестве альтернативы методам с одним аргументом можновоспользоваться операциями ==, !=, < >, <=, >=.

http://www.slideshare.net/IgorShkulipa 7

Методы вставки данных

Вставка данных

⚫ insert (size_type pos1, const basic_string& s) - вставка stl

строки;

⚫ insert (size_type pos,const basic_string& s,size_type

pos2=0,size_type n=npos) - вставка части stl строки;

⚫ insert (size_type pos, const char* s) - вставка C-строки;

⚫ insert (size_type pos, const char* s, size_type n) - вставка

части C строки;

⚫ insert (size_type pos, size_type n, char c) - вставка

нескольких одинаковых символов.

Вставка данных, позиция вставки указана итератором:

⚫ insert (iterator p, char) - вставка символа;

⚫ insert (iterator p, size_type n, char c) - вставка нескольких

одинаковых символов;

⚫ insert (iterator p,InputIterator f,InputIterator l) - вставка

строки заданной итераторами.

Большинство методов возвращают ссылку на себя (*this).

http://www.slideshare.net/IgorShkulipa 8

Методы замены

Замена части строки

Замена участка строки, указанного позицией и размером:

⚫ replace (size_type pos,size_type n1, const basic_string& s) - замена stl

строкой;

⚫ replace (size_type pos1,size_type n1,const basic_string& str,size_type

pos2,size_type n2) - замена частью stl строкой;

⚫ replace (size_type pos, size_type n1, const char* s) - замена C строкой;

⚫ replace (size_type pos,size_type n1,const char* s,size_type n2) -

замена частью C строки;

⚫ replace (size_type pos, size_type n1, size_type n2, char c) - замена

несколькими символами.

Замена участка, указанного итераторами:

⚫ replace (iterator i1, iterator i2,const basic_string& str) - замена stl

строкой;

⚫ replace (iterator i1, iterator i2, const char* s) - замена C строкой;

⚫ replace (iterator i1, iterator i2, const char* s,size_type n) - замена

частью C строки;

⚫ replace (iterator i1, iterator i2, size_type n,char c) - замена

несколькими символами;

⚫ replace (iterator i1, iterator i2,InputIterator j1, InputIterator j2) -

замена строкой заданной итераторами.

Методы возвращают ссылку на себя (*this).

http://www.slideshare.net/IgorShkulipa 9

Методы поиска элементов строки

Поиск указанного элемента

⚫ find (const string& str) const - поиск stl строки;

⚫ find (const string& str, size_type idx) const - поиск stl строки

с указанной позиции;

⚫ find (const charT* s, size_type pos = 0) const - поиск C строки

с указанной позиции;

⚫ find (const charT* s, size_type pos, size_type n) const -

поиск подстроки с указанной позиции;

⚫ find (charT c, size_type pos = 0) const - поиск символа с

указанной позиции.

Также есть аналогичные методы rfind, делающие поиск справа налево.Методы возвращают позицию найденного элемента или npos (обычноравной -1).

http://www.slideshare.net/IgorShkulipa 10

Поиск символов, не входящих в строку

Поиск символа не входящего в строку

⚫ find_first_not_of (const basic_string& str, size_type

pos = 0) const;

⚫ find_first_not_of (const char* s,size_type

pos,size_type n) const;

⚫ find_first_not_of (const char* s,size_type pos=0)

const;

⚫ find_first_not_of (char c, size_type pos = 0) const.

Методы возвращают позицию найденного символа или npos (-1).

http://www.slideshare.net/IgorShkulipa 11

Поиск символов, входящих в строку

Поиск символа входящего в указанную строку:

⚫ find_first_of (const basic_string& str,size_type pos=0)

const;

⚫ find_first_of (const char* s,size_type pos,size_type n)

const;

⚫ find_first_of (const char* s, size_type pos=0) const;

⚫ find_first_of (charT c, size_type pos=0) const;

Методы возвращают позицию найденного символа или npos (-1).

http://www.slideshare.net/IgorShkulipa 12

Удаление символов из строки

Удаление символов строки

⚫ erase (size_type pos=0,size_type n=npos) - удаляет n

символов с указанной позиции;

⚫ erase (iterator p) - удаляет один символ в указанной

позиции;

⚫ erase (iterator f, iterator l) - удаляет символы с

позиции f по l.

http://www.slideshare.net/IgorShkulipa 13

Другие методы строковых классов

begin() - итератор на первый символа;

end() - итератор на позицию за последним символом;

rbegin() - итератор на последний элемент (для обратных

алгоритмов);

rend() - итератор на позицию перед первым элементом (для

обратных алгоритмов);

size() - размер строки;

substr(size_type pos = 0, size_type n=npos) const -

выделение подстроки;

c_str() - преобразование в C строку (возвращается указатель

на первый символ);

copy(char* buf, size_type buf_size) const - копировать

buf_size символов в буфер;

copy(char* buf, size_type buf_size, size_type pos) const -

копировать buf_size символов с указанной позиции в буфер;

http://www.slideshare.net/IgorShkulipa 14

Ввод/вывод в C++

http://www.slideshare.net/IgorShkulipa 15

Классы ввода/вывода в C++

Объекты, связанные с консолью cout и cin - это обычные объекты. Аоператоры извлечения из потока >> и вставки в поток << -

перегруженные операции классов этих объектов.

Базовым классом является класс ios. У класса ios довольно много

производных классов.

cin и cout - объекты классов istream (от Input Stream - поток ввода) иostream (от Output Stream - поток вывода) соответственно. Именно

для этих классов перегружены операторы извлечения и вставки.

Наследниками istream и ostream являются ifstream (от Input FileStream) и ofstream (от Output File Stream).

Кроме того, есть ещё один класс - fstream (от File Stream - фаловыйпоток), в котором объединены возможности ifstream и ofstream.fstream наследует одновременно и от istream, и от ostream.

http://www.slideshare.net/IgorShkulipa 16

Текстовые и бинарные файлы

Текстовый файл Двоичный файл

1. Содержимое представлено в двоичном виде с использованием кодировок.

1. При открытии мы видим текст.

1. Файл разбит на блоки для кодирования одной буквы.

1. Содержимое представлено в двоичном виде.

1. Файл не разбит на фиксированные блоки (разбит по 1 байту).

http://www.slideshare.net/IgorShkulipa 17

Создание текстового файла

Необходимо включить заголовочный файл fstream (классы ifstream иofstream)

Также нужно подключить заголовочный файл iostream (операторывставки и извлечения из потоков)

ofstream os("text.txt");

os << "Hello, World!";

os.close();

Конструктор класса ofstream принимает параметр - символьную строкусодержащую название файла, в который будет осуществляться вывод.

Затем потоковый объект используется точно также как и cout. Тольковывод будет осуществляться не в консоль, а в файл text.txt.

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

http://www.slideshare.net/IgorShkulipa 18

Чтение текстового файла

char a[6];

ifstream is("text.txt");

is >> a;

is.close();

is использует оператор извлечения из потока, точно также как иобъект cin.

Для массива a выделено на один байт больше количества букв в

слове, так как в этот массив включается так же и символ концафайла.

http://www.slideshare.net/IgorShkulipa 19

Двоичный режим записи и чтения файлов

Конструкторы классов ifstream и ofstream могут принимать

второй параметр - набор флагов. Одним из флагов указываетсядвоичный режим:

ofstream os(“binary.bin", ios::binary);

ifstream is(“binary.bin", ios::binary);

Для чтения и записи двоичных файлов используются методы readи write

void ofstream::write (char*, long);

void ifstream::read (char*, long);

http://www.slideshare.net/IgorShkulipa 20

Режимы открытия файла

fstream file;

file.open(file, "параметры через |");

Параметры:

⚫ ios::in - открыть файл для чтения

⚫ ios::out - открыть для записи в начало файла

⚫ ios::app - открыть для дозаписи в конец файла

⚫ ios::ate - установить указатель в конец файла

⚫ ios::thrunc - очистить файл если он существует

⚫ ios::binary - открыть файл в бинарном формате

http://www.slideshare.net/IgorShkulipa 21

Строковые потоки

В библиотеке STL есть также класс stringstream (заголовочныйфайл #include <sstream>), который позволяет связать поток

ввода-вывода со строкой.

Всё, что выводится в такой поток, добавляется в конец строки;всё, что считывается из потока — извлекается из началастроки.

stringstream ss;

int choice;

cin >> choice;

ss << “Your choice is ” << choice << “\n”;

string strText = “Formatted string= ”;

strText += ss.str();

cout << strText;

http://www.slideshare.net/IgorShkulipa 22

Лабораторная работа №12. Ввод-вывод в С++.

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

Реализовать меню для управления копированием:

⚫Скопировать файл

⚫Скопировать часть файла

⚫ Удалить файл

⚫Создать новый файл