// строкой "––––" line
{
ifstream in(n.c_str); // открываем файл
if (!in) {
cerr << " нет " << n << '\n';
exit(1); // прекращаем выполнение программы
}
string s;
while (getline(in,s)) lines.push_back(s); // создаем вектор
// строк
Line_iter first = lines.begin; // создаем вектор сообщений
for (Line_iter p = lines.begin; p!=lines.end; ++p) {
if (*p == "––––") { // конец сообщения
m.push_back(Message(first,p));
first = p+1; // строка –––– не является частью
// сообщения
}
}
}
Обработка ошибок носит слишком элементарный характер. Если бы писали эту программу для своих друзей, то постарались бы сделать ее лучше.
ПОПРОБУЙТЕ
Что значит “более хорошая обработка ошибок”? Измените конструктор класса Mail_file
Функции find_from_addr
find_subject
не имеют конкретного содержания, пока мы не выясним, как идентифицировать информацию в файле (используя регулярные выражения и из разделов 23.6–23.10).int is_prefix(const string& s, const string& p)
// Является ли строка p первой частью строки s?
{
int n = p.size;
if (string(s,0,n)==p) return n;
return 0;
}
bool find_from_addr(const Message* m, string& s)
{
for(Line_iter p = m–>begin; p!=m–>end; ++p)
if (int n = is_prefix(*p,"From: ")) {
s = string(*p,n);
return true;
}
return false;
}
string find_subject(const Message* m)
{
for(Line_iter p = m.begin; p!=m.end; ++p)
if (int n = is_prefix(*p,"Subject: "))
return
string(*p,n);
return "";
}
string(s,n)
s
, начиная с элемента s[n]
(т.е. s[n]..s[s.size–1]
), а конструктор string(s,0,n)
создает строку, состоящую из символов s[0]..s[n–1]
. Поскольку эти операторы на самом деле создают новые строки и копируют символы, они должны использоваться очень осторожно, чтобы не снизить производительность программы. find_from_addr
find_subject
так отличаются друг от друга? Например, одна из них возвращает переменную типа bool
, а другая — объект класса string
. Потому что мы хотели подчеркнуть следующие моменты.• Функция find_from_addr
""
) и поиск отсутствующей строки адреса. В первом случае функция find_from_addr
возвращает значение true
(поскольку она нашла адрес) и присваивает строке s
значение ""
(потому что адресная строка просто оказалась пустой). Во втором случае она возвращает значение false
(поскольку в файле вообще не оказалось адресной строки).• Функция find_subject
""
и когда строка темы сообщения оказалась пустой, и когда ее вообще нет.Насколько полезным является такое различие, которое проводит функция find_from_addr
find_from_addr
и find_subject
, следовало бы написать в стиле функции find_from_addr
, чтобы дать пользователям возможность проводить такое различие.Эта программа не является оптимальной с точки зрения производительности, но мы надеемся, что в типичных ситуациях она работает достаточно быстро. В частности, она считывает входной файл только один раз и не хранит несколько копий текста из этого файла. Для крупных файлов было бы целесообразно заменить класс multimap
unordered_multimap
, но без испытаний невозможно сказать, насколько это повысит эффективность программы.Введение в стандартные ассоциативные контейнеры (map
multimap
, set
, unordered_map
и unordered_multimap
) см. в разделе 21.6.23.5. Проблема