c++ Базовый. Занятие 12
TRANSCRIPT
Модуль 3: Основные понятия объектно-ориентированного программирования.
Темы лекции: Строки. Потоки ввода-вывода.
Практическое задание: Ввод-вывод в С++.
Тренер: Игорь Шкулипа, к.т.н.
C++ Базовый. Занятие 12
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 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. Ввод-вывод в С++.
Создать программу, выполняющую копирование файлов.
Реализовать меню для управления копированием:
⚫Скопировать файл
⚫Скопировать часть файла
⚫ Удалить файл
⚫Создать новый файл