Программирование. Принципы и практика использования C++ Исправленное издание, стр. 321
// строкой "––––" 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()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)ss[n]s[n]..s[s.size()–1]string(s,0,n)s[0]..s[n–1]
find_from_addr()find_subject()boolstring• Функция
find_from_addr()""find_from_addr()trues""false• Функция
find_subject()""Насколько полезным является такое различие, которое проводит функция
find_from_addr()find_from_addr()find_subject()find_from_addr()Эта программа не является оптимальной с точки зрения производительности, но мы надеемся, что в типичных ситуациях она работает достаточно быстро. В частности, она считывает входной файл только один раз и не хранит несколько копий текста из этого файла. Для крупных файлов было бы целесообразно заменить класс
multimapunordered_multimapВведение в стандартные ассоциативные контейнеры (
mapmultimapsetunordered_mapunordered_multimap