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

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

Если последний параметр задать по умолчанию, то функцию можно использовать в двух режимах. Вставьте тело этой глобальной функции в начало файла 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;
  • познакомились с простыми приемами синтаксического анализа текста с известной структурой.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.