Используя функцию-член erase() с одним параметром, удалите из ilist все нечетные элементы.
6.7. Читаем текстовый файл
Первая наша задача – прочитать текстовый файл, в котором будет производиться поиск. Нам нужно сохранить следующую информацию: само слово, номер строки и позицию в строке, где слово встречается.
Как получить одну строку текста? Стандартная библиотека предоставляет для этого функцию getline():
istream
getline( istream is, string str, char delimiter );
getline()берет из входного потока все символы, включая пробелы, и помещает их в объект типа string, до тех пор пока не встретится символ delimiter, не будет достигнут конец файла или количество полученных символов не станет равным величине, возвращаемой функцией-членом max_size()класса string.
Мы будем помещать каждую такую строку в вектор.
Мы вынесли код, читающий файл, в функцию, названную retrieve_text(). В объекте типа pair дополнительно сохраняется размер и номер самой длинной строки. (Полный текст программы приводится в разделе 6.14.)
Вот реализация функции ввода файла:
// возвращаемое значение - указатель на строковый вектор
vectorstring,allocator*
retrieve_text()
{
string file_name;
cout "please enter file name: ";
cin file_name;
// откроем файл для ввода ...
ifstream 1nfile( file_name.c_str(), ios::in );
if ( ! infile ) {
cerr "oops! unable to open file "
file_name " -- bailing out!\n";
exit( -1 );
}
else cout '\n';
vectorstring, allocator *1ines_of_text =
new vectorstring, allocator;
string textime;
typedef pairstring::size_type, int stats;
stats maxline;
int linenum = 0;
while ( getline( infile, textline, '\n' )) {
cout "line read: " textline '\n';
if ( maxline.first textline.size() ) {
maxline.first = textline.size() ;
maxline.second = linenum;
}
lines_of_text-push_back( textline );
linenum++;
}
return lines_of_text;
}
Вот как выглядит вывод программы (размер страницы книги недостаточен, чтобы расположить напечатанные строки во всю длину, поэтому мы сделали в тексте отступы, показывающие, где реально заканчивалась строка):
please enter file name: a1ice_emma
line read: Alice Emma has long flowing red hair. Her Daddy says
line read: when the wind blows through her hair, it looks
almost alive,
line read: like a fiery bird in flight. A beautiful fiery bird,
he tells her,
line read: magical but untamed. "Daddy, shush, there is no such
thing, "
line read: she tells him, at the same time wanting him to tell
her more.
line read: Shyly, she asks, "I mean. Daddy, is there?"
number of lines: 6
maximum length: 66
longest line: like a fiery bird in flight. A beautiful fiery
bird, he tells her,
После того как все строки текста сохранены, нужно разбить их на слова. Сначала мы отбросим знаки препинания. Например, возьмем строку из части “Anna Livia Plurrabelle” романа “Finnegans Wake”.
"For every tale there's a telling,
and that's the he and she of it."
В приведенном фрагменте есть следующие знаки препинания:
"For
there's
telling,
that's
it."
А хотелось бы получить:
For
there
telling
that
it
Можно возразить, что
there's
должно превратиться в
there is
но мы-то движемся в другом направлении: следующий шаг – это отбрасывание семантически нейтральных слов, таких, как is, that, and, it и т.д. Так что для данной строчки из “Finnegans Wake” только два слова являются значимыми: tale и telling, и только по этим словам будет выполняться поиск. (Мы реализуем набор стоп-слов с помощью контейнерного типа set, который подробно рассматривается в следующем разделе.)