Синтаксический анализ файла
Если последний параметр задать по умолчанию, то функцию можно использовать в двух режимах. Вставьте тело этой глобальной функции в начало файла LookDlg.cpp (после объявления массива gsFacilities):
int FindText (ifstreams is, strings s, TCHAR *text=NULL) { //=== Ищет подстроку <text> или первую непустую строку //=== Цикл прохода по всем строкам файла for (int pos=-l; pos==-l &&!is.eof();) { //====== Считываем всю строку (до символа'\n') getline (is, s, '\n'); //====== В первом режиме text не равен нулю //====== и мы ищем этот текст, иначе ищем //====== первый непустой символ pos = text? s.find(text): s.find_first_not_of("/ "); if (pos!=-1) // Если нашли s.erase(0,pos); // Усекаем строку слева }; // Если искали и нашли текст, то возвращаем его длину // которая имеет смысл позиции, следующей за текстом if (text &&! is.eof ()) return strlen (text); // Если ищем непустую строку, то пропускаем все пустые string st; for (pos=0; pos!=-1 &&!is.eof();) { getline(is,st,'\n'); pos = st.find_first_not_of("/ "); //====== Если нашли непустой текст, //====== то сливаем его с уже найденным if (pos!= -1) s += ' ' + st.substr(pos); } // Возвращаем 0-ю позицию, так как нужен весь текст return 0; }
В такие моменты, когда программа почти готова, важно остановиться и вспомнить, не забыли ли мы выключить газ и свет. Я имею в виду освободить память, занимаемую какими-либо динамическими структурами. Мы используем контейнер структур, который необходимо где-то освобождать. Введите в public-секцию класса CLookDlg (в h-файле) деструктор этого класса:
~CLookDlgO { m_Vector.clear(); }
Это делать не обязательно, так как деструктор вызывается при выходе из приложения уже после того, как окно исчезло с экрана. Windows, закрывая процесс, освободит всю память, как в стеке, так и в heap, но правила хорошего тона говорят, что за собой надо убирать. Другим моментом, связанным с забывчивостью, является отсутствие директив #include для файлов заголовков используемых библиотек. Вы помните, что это следует делать в файле stdafx.h, чтобы пользоваться преимуществами pch-файла, который ускоряет повторные компиляции. Вставьте в конец файла stdafx.h следующие строки:
#include <iostream> // Потоковый ввод-вывод STL //=== Буферизованные потоки, связанные с файлами (STL) #include <fstream> #include <string> // Текстовые строки STL #include <vector> // Контейнеры STL типа vector //====== Работаем в пространстве имен std using namespace std;
Запустите программу, устраните возможные синтаксические и семантические ошибки и хорошо протестируйте. Подведем итог:
- мы узнали о двух форматах данных типа HRESULT, которые используются для хранения информации о результате выполнения каких-либо операций;
- потренировались в использовании контейнера STL и некоторых из его алгоритмов;
- научились работать с объектами класса string, определенного в STL;
- узнали, как с помощью инструментов студии создаются диалог, переменные диалогового класса (связываемые с элементами управления диалога), а также функции обмена данными с этими полями;
- познакомились с уведомляющими сообщениями, работающими по схеме WM_NOTIFY, принятой для многих новых элементов управления;
- узнали, как можно синхронизировать работу нескольких элементов управления;
- применили объекты классов потокового ввода-вывода для чтения файла с данными о кодах ошибок;
- научились производить поиск необходимой информации в реестре Windows;
- познакомились с простыми приемами синтаксического анализа текста с известной структурой.