Всё для Учёбы — студенческий файлообменник
1 монета
pdf

Студенческий документ № 043121 из НИТУ МИСиС

Объектно-ориентированное программирование

с использованием C++

Полевой Дмитрий Валерьевич

к.т.н., доцент КиК e-mail: oop.misis@gmail.com

Символ

• графическое начертание

• код (числовое значение при хранении в памяти)

• символьный набор (кодовая таблица)

Си-строка

• массив символов заканчивающийся нуль-терминатором

• источник постоянных ошибок

Проблемы манипуляции с Си-строками

• низкоуровневая работа с массивом

• отслеживание конца строки

• отслеживание размера буфера

• большое число функций

Кодовые таблицы и юникод

• char и wchar_t • национальные таблицы

- CP866, Win1251 и т.д.

• Unicode (переменный размер)

- UTF8

• Unicode (фиксированный размер)

- UTF16, UTF32 Символ

(стандартная библиотека)

• класс-свойств

template struct char_traits;

char_type - тип символов pos_type - целый тип, определяющий

позицию в потоке

Строковый класс (std::string)

• стандартная библиотека

• стандарт не определяет конкретный способ хранения строк в памяти

• стандарт допускает реализацию с подсчетом ссылок

Шаблонное объявление

template , class Al = allocator >

class basic_string;

typedef basic_string string;

Создание строки

• пустая строка

пример: string str();

• инициализация строковым литералом

пример:

string str("misis");

• копирование существующей

пример: string str(strOld);

Инициализация строки символом

• невозможна инициализация символом

пример: //string('a')

• возможна инициализация несколькими экземплярами символа

пример:

string('a', cnt)

Присвоение

•assign •operator=

пример:

strFI.assign(str); strFI.assign(""); strFI = str; strFI = "test text";

Размер строк

• размер буфера capacity • резервирование reserve • длинна строки

(без нуля)

length size • изменение длины (дополняется пробелами или усекается) resize

Преобразование в С-строку

const Ch* c_str() const

- записывает символы в массив, дополняя их финальным нулем

const Ch* data() const

- записывает символы в массив

• копирование из внутреннего буфера во внешний

copy Присоединение к строке

•append •operator+=

пример: strFI.append(strFamilyName); strFI.append(" "); strFI += strName;

Конкатенация строк

• объединение содержимого строк operator+

пример:

strFI = strFamilyName + string(" ")

+ strName; Вставка символов

• вставка подстроки

пример:

strFI.insert(posName, name);

• вставка с заменой

пример: st.replace(pos, lnOld, lnNew, name);

- вставка начинается перед указанной позицией

Поиск в строке

•string::npos - при неудачном поиске

•find - заданная группа символов

•rfind

- с конца, заданная группа символов

Поиск совпадающих

•find_first_of

- первый символ из заданной группы

•find_last_of - последний символ из заданной группы

24.03.201202 12 09

Поиск отличающихся

•find_first_not_of

- первый символ не совпадающий ни с одним из символов заданной группы

•find_last_not_of

- последний символ не совпадающий ни с одним из символов заданной группы

Доступ к символу

•operator[] - по индексу без контроля выхода за границы

•at - по индексу с контролем выхода за границы - при ошибке исключение std::out_of_range

24.03.201202 12 09

Удаление символов

•erase - удаление символов

•clear - очистка строки

пример: st.clear(); st.erase(lBeg, string::npos); st.erase(lBeg, lEnd - lBeg + 1);

Проверка на пустоту

•empty пример:

if (0 == str.empty())

// строка не пустая

{ //обработка

} Потоковый ввод и вывод

• вывод operator>

Сравнение символов

• лексикографическоесравнение

- упорядочение в алфавите

- упорядочение в кодовой таблице

• символы нижнего регистра меньше символов верхнего

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

• происходит лексикографическим сравнением символов до первого несовпадения

• упорядоченность строк определяется порядком несовпадающих символов

Функции сравнение строк

•operator==

•operator!= •operator>

•operator= •operator

- стандартные - опережающие потоки объявления

- файловые потоки - манипуляторы

- строковые потоки - буферы

Преимущества стандартной библиотеки ввода/вывода

• контроль типов передаваемых данных

• использование одного кода для работы с разными потоками (через полиморфизм)

• расширяемость

- ввод и вывод новых типов

- новые классы потоков

Стандартные потоки

• глобальные переменные

• консольный ввод и вывод

-cin и cout • протоколирование ошибок

-cerr • ведение логов

-clog

Опережающее объявление

• сокращает время компиляции

• можно использовать для указателей и ссылок

пример:

// in comp.h class CStack;

... bool compute(const CStack& stack);

Опережающее объявление потоков

// class ostream; // не сработает

namespace std { template >

class basic_ostream;

typedef basic_ostream ostream;

} Базовые операции

• открытие (создание)

•operator> - чтение из потока (извлечь данные)

• проверка состояния

• закрытие (уничтожение)

Типы ввода и вывода

• форматированный

- текстовый

• неформатированный

- двоичный

Формат • система счисления (oct, dec, hex)

• отступы

• заполнители

• разделители

• формат префиксов и суффиксов

• разделителя разрядов

• и т.д.

Форматирование

• формат - состояние потока

(флаги форматирования)

• изменение формата

- функции

- манипуляторы

Форматные флаги (примеры)

•ios::showbase

- признак системы счисления (dec, oct или hex)

•ios::showpoint

- десятичная точка и завершающих нулей в вещественных числах

•ios::uppercase

- верхний регистр букв A-F (hex) и Е (exp)

•ios::showpos - отображение знака плюс (+) для положительных величин

Флаги форматирования (функции)

fmtflags flags()

- получить текущие флаги

fmtflags flags(fmtflags flNew)

- установить флаги

fmtflags setf(fmtflags flSet) fmtflags setf(fmtflags bits, fmtflags field)

- добавить флаги

fmtflags unsetf(fmtflags flClear)

- снять флаги

Форматное поле

• должен быть установлен только один бит из группы

• автоматический сброс остальных бит не происходит

• используйте перегруженную версию setf

Форматные поля

• система счисления целых ios::basefield

• вид чисел с плавающей точкой ios::floatfield

• выравнивание внутри поля ios::adjustfield

Форматные поля (примеры)

•ios::oct - восьмиричные целые

•ios::dec - десятичные целые

•ios::hex - шестнадцатиричные целые

пример:

s.setf(ios::hex, ios::basefield);

Манипулятор

• специальный объект, вызывающий функцию потока

• стандартные манипуляторы определены в пространстве имен std

пример:

strm пример:

while (0 != getline(file, str).fail())

{ //... } Обработка ошибок ввода и вывода

• существует состояние потока

• текущее состояние зависит от успешности предыдущих операций с потоком

• возможность реализации операции с потоком зависит от текущего состояния

Состояние потока (флаги)

•ios::badbit

- фатальная ошибка, поток использовать нельзя

•ios::eofbit - обнаружен конец входных данных (физически достигнут конец файла, пользователь закончил консольный ввод нажатием Ctrl+Z или Ctr+D)

Состояние потока (флаги)

•ios::failbit

- операция завершилась неудачей (нарушен формат или обнаружен конец данных)

•ios::goodbit - ошибок нет, конец данных не обнаружен

Проверка состояния потока

•good()

-goodbit •eof()

-eofbit или badbit

•fail() -failbit или badbit

•bad()

-badbit Установка состояния потока

•clear(iostate _State = goodbit)

- сбросить все флаги и установить заданные

•setstate(iostate _State)

- установить флаги

пример: cout.clear(ios::failbit); cout.setstate(ios::failbit |

~ios::goodbit); Исключения в потоках

• поток может генерировать исключения std::ios_base::failure для заданных флагов состоянии

•exceptions

- устанавливает статусы

пример: stmFile.exceptions(ios::badbit);

Неформатированный ввод

• чтение отдельного символа или последовательности из потока

•get

- прочитать из потока отдельный символ

•read - прочитать из потока последовательность

Неформатированный вывод

• вывод отдельного символа или последовательности в поток

•put

- записать в поток отдельный символ

•write - записать в поток последовательность

Файловые потоки

• прикрепляются к объектам файловой системы

•ofstream •ifstream

•fstream Цикл работы с файлом

• конструктор

•open

•close • деструктор

пример: ifstream inData(path);

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

•ios::in

- чтение (без усечения)

•ios::out - запись (без усечения)

•ios::app - дописывание

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

•ios::ate - существующий файл (чтение, запись в конец)

•ios::trunc - существующий файл (запись с начала)

•ios::binary - двоичный режим

Файловый поток (пример)

fstream dataFile(path.c_str()

, ios::ate); dataFile > obj;

... 24.03.2012 cppNewb.ru 2

24.03.2012 cppNewb.ru 3

cppNewb.ru 18

24.03.2012 cppNewb.ru 2

cppNewb.ru 18

24.03.2012 cppNewb.ru 2

24.03.2012 cppNewb.ru 2

24.03.2012 cppNewb.ru 2

Показать полностью…
134 Кб, 7 апреля 2012 в 11:16 - Россия, Москва, НИТУ МИСиС, 2012 г., pdf
Рекомендуемые документы в приложении