Иллюстрированный самоучитель по Visual Studio.Net

Альбом для монет 5 рублей 2014 70-летие победы в Вов на www.detect-standard.ru. | игрушка бульбазавр, wargaming. |

Синтаксический анализ файла


До сих пор мы исходили из предпосылки, что вся информация об ошибках уже получена и хранится в контейнере структур ERROR_VECTOR m_vector. Контейнер заполняется в функции ReadErrors, которая в цикле вызывает функцию GetNextErrorCode. Пришла пора создать эту функцию. Мы решили сделать ее глобальной, так как ее задача — найти и расшифровать очередную ошибку в потоке типа if stream (то есть файле) — довольно универсальна и не зависит от данных оконного класса. Глобальную функцию нет необходимости объявлять в интерфейсе класса (header-файле), поэтому просто вставьте следующий код в файл LookDlg.cpp (после объявления массива gsFacilities):

bool GetNextErrorCode(ifstreams is)

{

//===== Поиск и выбор очередной ошибки из потока is

string s;

//==== Ищем строку текста "Messageld:"

int pos = FindText(is, s, "Messageld: ");

//==== Если дошли до конца файла, уходим

if (is.eof())

return false;

//=== Индекс ошибки следует за строкой "Messageld:

gsID = s.substr(pos);

//=== Ищем строку текста "MessageText: "

FindText(is, s, "MessageText:");

// Текстовое описание ошибки следует за пустым текстом

FindText(is, gsMsg="");

// Код ошибки (или HRESULT) следует за #define

FindText(is, s, "tdefine");

//== Ищем 'L' и стираем его и все, что за ним следует s.erase(pos=s.гfind("L"));

//======= Ищем пробел слева от кода

gCode = s.substr(s.rfind(" ",pos)+l);

//=== Ищем скобку, которая предшествует СОМ-ошибкам

if ( (pos=gCode.rfind("(")) != -1)

gCode.erase(0,pos+l); // Усекаем строку слева

return true;

}

Файл WinError.h не был введен вручную. Он сгенерирован специальной программой и поэтому имеет регулярную, стабильную структуру, специфику которой мы используем"для проведения синтаксического анализа и поиска нужной информации. Вы можете вновь обратиться к структуре текста, описывающего ошибку. Она приведена в начале главы. Использование заранее известных признаков, выделяющих искомый текст из всей массы символов, является характерным приемом при проведении синтаксического анализа текста.


Начало  Назад  Вперед