Чтение онлайн

на главную

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

Считываем строку в объект

buffer
, затем просматриваем каждый символ строки в поисках кандидатов на замену. Функция
is_whitespace
является членом класса
Punct_stream
, который мы определим позднее. Функция
tolower
— это стандартная библиотечная функция, выполняющая очевидное задание, например превращает символ
A
в символ
a
(см. раздел 11.6).

После правильной обработки строки

line
ее необходимо записать в поток
istringstream
. Эту задачу выполняет функция
buffer.str(line);
эту команду можно прочитать так: “Поместить строку из объекта
buffer
класса
istringstream
в объект
line
”.

Обратите внимание на то, что мы “забыли” проверить состояние объекта

source
после чтения данных с помощью функции
getline
. Это не обязательно, поскольку в начале цикла выполняется проверка условия
!source.good
.

Как всегда, оператор

>>
возвращает ссылку на поток
*this
(раздел 17.10).

Проверка разделителей проста; мы сравниваем символ с каждым символом из строки, в которой записаны разделители.

bool Punct_stream::is_whitespace(char c)

{

for (int i = 0; i<white.size; ++i)

if (c==white[i]) return true;

return false;

}

Напомним, что поток

istringstream
обрабатывает обычные разделители (например, символы перехода на новую строку или пробел) по-прежнему, поэтому никаких особых действий предпринимать не надо.

Осталась одна загадочная функция.

Punct_stream::operator bool

{

return !(source.fail || source.bad) && source.good;

}

Обычное использование потока

istream
сводится к проверке результата оператора
>>
. Рассмотрим пример.

while (ps>>s) { /* ... */ }

Это значит, что нам нужен способ для проверки результата выполнения инструкции

ps>>s
, представленного в виде булевого значения. Результатом инструкции
ps>>s
является объект класса
Punct_stream
, поэтому нам нужен способ неявного преобразования класса
Punct_stream
в тип
bool
. Эту задачу решает функция operator
bool
в классе
Punct_stream
.

Функция-член operator

bool
определяет преобразование класса
Punct_stream
в тип
bool
. В частности, она возвращает значение
true
, если эта операция над классом
Punct_stream
прошла успешно.

Теперь можем написать программу.

int main

// вводит текст и создает упорядоченный список всех слов

// из заданного текста, игнорируя знаки пунктуации и регистры,

// а также удаляя дубликаты из полученного результата

{

Punct_stream ps(cin);

ps.whitespace(";:,.?!\"{}<>/&$@#%^*|~"); // \" в строке

// означает "

ps.case_sensitive(false);

cout << "Пожалуйста,
введите слова \n";

vector<string> vs;

string word;

while (ps>>word) vs.push_back(word); // ввод слов

sort(vs.begin,vs.end); // сортировка в лексикографическом

// порядке

for (int i=0; i<vs.size; ++i) // запись в словарь

if (i==0 || vs[i]!=vs[i–1]) cout << vs[i] << endl;

}

Этот код создает упорядоченный список введенных слов. Инструкция

if (i==0 || vs[i]!=vs[i–1])

удаляет дубликаты. Если в программу ввести слова

There are only two kinds of languages: languages that people complain

about, and languages that people don’t use.

то результат ее работы будет выглядеть следующим образом:

about

and

are

complain

don’t

kind

languages

of

only

people

that

there

two

use

Почему мы получили на выходе

don’t
, а не
dont
? Потому что оставили апостроф за пределами списка разделителей
whitespace
.

Внимание: класс
Punct_stream
во многом похож на класс
istream
, но на самом деле отличается от него. Например, мы не можем проверить его состояние с помощью функции
rdstate
, функция
eof
не определена, и нет оператора
>>
, который вводит целые числа. Важно отметить, что мы не можем передать объект класса
Punct_stream
в качестве аргумента функции, ожидающей поток
istream
. Можно ли определить класс
Punct_istream
, который в точности повторял бы поведение класса
istream
? Можно, но у вас пока нет достаточного опыта программирования, вы еще не освоили основы проектирования и не знаете всех возможностей языка (если впоследствии вы вернетесь к этой задаче, то сможете реализовать буферы потоков на уровне профессионала).

Легко ли читать определение класса
Punct_stream
? Понятны ли вам объяснения? Могли бы вы самостоятельно написать такую программу? Еще несколько дней назад вы были новичком и честно закричали бы: “Нет, нет! Никогда!” или “Нет, нет! Вы что, с ума сошли? Очевидно, что ответ на поставленный вопрос отрицательный”. Цель нашего примера заключается в следующем:

• показать реальную задачу и способ ее решения;

• доказать, что это решение можно найти с помощью вполне доступных средств;

Поделиться:
Популярные книги

Золушка по имени Грейс

Ром Полина
Фантастика:
фэнтези
8.63
рейтинг книги
Золушка по имени Грейс

Отмороженный 6.0

Гарцевич Евгений Александрович
6. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 6.0

Заставь меня остановиться 2

Юнина Наталья
2. Заставь меня остановиться
Любовные романы:
современные любовные романы
6.29
рейтинг книги
Заставь меня остановиться 2

Бальмануг. (не) Баронесса

Лашина Полина
1. Мир Десяти
Фантастика:
юмористическое фэнтези
попаданцы
5.00
рейтинг книги
Бальмануг. (не) Баронесса

Седьмая жена короля

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Седьмая жена короля

Камень. Книга вторая

Минин Станислав
2. Камень
Фантастика:
фэнтези
8.52
рейтинг книги
Камень. Книга вторая

Неудержимый. Книга IX

Боярский Андрей
9. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IX

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

6 Секретов мисс Недотроги

Суббота Светлана
2. Мисс Недотрога
Любовные романы:
любовно-фантастические романы
эро литература
7.34
рейтинг книги
6 Секретов мисс Недотроги

Приручитель женщин-монстров. Том 3

Дорничев Дмитрий
3. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 3

Странник

Седой Василий
4. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Странник

На границе империй. Том 7. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 7. Часть 4

В зоне особого внимания

Иванов Дмитрий
12. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
В зоне особого внимания

Назад в СССР: 1985 Книга 2

Гаусс Максим
2. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Назад в СССР: 1985 Книга 2