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


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


Так, мы знаем, что идентификатор ошибки следует за строкой «Messageld:» (с учетом пробела), поэтому мы ищем позицию конца этой строки и выбираем подстроку (substring) начиная с этой позиции:

gsID = s.substr(pos);

Алгоритм поиска строки текста реализован в функции FindText, которая еще не создана, но уже сейчас предъявлены к ней требования. Мы хотим, чтобы она построчно считывала файл и работала в двух режимах:

  • поиск позиции конца строки, заданной в параметре;

  • поиск непустой строки текста и выбор ее в переменную, переданную параметром.

Пустой мы считаем строку, которая содержит только символы комментария и/ или символы пробела. Также известно, что текстовое описание ошибки следует за строкой «MessageText:». Поэтому после нахождения этой строки поиск запускается во втором режиме, когда FindText пропускает пробелы и символы комментария «//» и читает текст, следующий за ними. Здесь важно отметить, что некоторые сообщения занимают несколько строк комментария, следовательно, надо выбрать все строки и слить их в одну, разделив пробелом.

Далее мы выделяем код ошибки с учетом особенностей, связанных с тем, что существуют два различающихся между собой формата: Win32-onni6oK и СОМ-ошибок. Все коды СОМ-ошибок стоят в скобках, имеют суффикс' L ' и префикс _HRESULT_TYPEDEF_. Зная этот факт, мы проводим синтаксический анализ так, чтобы выделить числовой код. Осталось написать код функции FindText, требования к которой уже сформулированы. Она должна получать в параметрах:

  • ссылку на объект, управляющий потоком ввода, связанным с файлом;
  • ссылку на строку типа string, в которую помещается результат;
  • адрес строки, которую надо найти.

Если последний параметр задать по умолчанию, то функцию можно использовать в двух режимах. Вставьте тело этой глобальной функции в начало файла LookDlg.cpp (после объявления массива gsFacilities):

int FindText (ifstreams is, strings s, TCHAR *text=NULL)

{

//=== Ищет подстроку <text> или первую непустую строку

//=== Цикл прохода по всем строкам файла




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