Отправляет email-рассылки с помощью сервиса Sendsay

Web-Мастеринг - с нуля до профи

  Все выпуски  

нет.


Информационный Канал Subscribe.Ru


Познавательное программирование



Выпуск 4


Здравствуйте, Уважаемые подписчики!

Для того чтобы микропроцессор мог работать, необходимы
некоторые вспомогательные компоненты, подобно тому как одного
двигателя недостаточно, чтобы заставить автомобиль двигаться.
- П. Нортон



ПРЕДИСЛОВИЕ
В этом выпуске рассылки я публикую программу, демонстрирующую загрузку INI-файла.
Она умеет считывать переменные типа Boolean, Integer, Extended(Real).

РАБОЧИЙ INI-ФАЙЛ
Вот как выглядит файл TEST.INI, с которым мы будем работать:
; -----------------------------------
;
; TEST.INI for INI-Loader
;
; Copyright (c) 2003 Nabatnikov Ivan
;
; -----------------------------------


; parameter name comments...
; ---------------|-------------------

; Boolean variables
b_param1 = 1 ; boolean parameter type #1
b_param2 = yes ; boolean parameter type #2
b_param3 = false ; boolean parameter type #3

; Integer variables
i_param1 = -256 ; integer parameter type #1
i_param2 = 100000 ; integer parameter type #2

; Extended variables
e_param1 = -1,000 ; Extended parameter type #1
e_param2 = 9.9999 ; Extended parameter type #2

СИНТАКСИС
- Всё, что находится за символом "точка с запятой" считается комментариями.
- Все табуляторы и пробелы игнорируются.
- Параметр находится до знака "равно"("="), а значение - после.

Как видите, тип boolean - самый разнообразный. Он может задаваться тремя типами значений: 0/1, no/yes, false/true.
Тип integer задаётся как обычно, здесь ничего нового не придумаешь.
А реальный тип extended может иметь в качестве разделителя дробной части и точку, и запятую.

ЗАМЕТКИ
1) Неизвестные переменные игнорируются.
2) Если нужный нам параметр в INI-файле не встретился, то он не меняет своего значения.
Для этого полезно использовать значения по-умолчанию, задаваемые перед чтением INI-файла.
3) Если один и тот же параметр встречается в INI-файле несколько раз, то он несколько раз меняется и в конце примет последнее значение.
4) В примере я не использую секции, так как считаю их в данном случае бесполезными.
Использовать их имеет смысл, когда имеется несколько параметров с одним именем, относящихся к разным частям иерархии данных в программе.

ИСХОДНЫЙ ФАЙЛ INILOAD.DPR ПРОГРАММЫ
program iniload;

{ INI_Loader (Open Source) }
{ Программа, демонстрирующая }
{ загрузку переменных из }
{ INI-файла }
{ (c) 2003 Nabatnikov Ivan }
{ urisff@inbox.ru }
{ http://newff.narod.ru }

{$APPTYPE CONSOLE}
uses SysUtils;

Var
b_param1,b_param2,b_param3: boolean;
i_param1,i_param2: integer;
e_param1,e_param2: extended;

function GetBoolVal(p: string): boolean;
//Эта функция возвращет TRUE, если P равно 1, yes или true
begin
Result:=false; //По-умолчанию значение FALSE
If (p='0') or (p='no') or (p='false') then Result:=false;
If (p='1') or (p='yes') or (p='true') then Result:=true;
end;

function GetIntVal(p: string): int64;
//Для ясности выделяем отдельную функцию
begin
Result:=StrToInt(p); //Можно было просто использовать StrToInt()
end;

function GetExtVal(p: string): extended;
//Эта функция преобразует строку P в реальный тип Extended
var
i: integer;
begin
//Все точки меняем на запятые
for i:=1 to Length(p) do
If p[i]='.' then p[i]:=',';
//Так как функция StrToFloat() не признаёт точки
Result:=StrToFloat(p); //^--на заметку Borland :)
end;

procedure CalcLine(s: string);
//Основная процедура обработки строки
var
i: integer;
r,v,p: string;
begin
//Удаляем комментарии, если есть...
If Pos(';',s)>0 then s:=Copy(s,1,Pos(';',s)-1);

//Удаляем табуляторы и пробелы, если есть...
If (Pos(#32,s)>0) or (Pos(#9,s)>0) then
begin
r:='';
for i:=1 to Length(s) do
If (s[i]<>#32) and (s[i]<>#9) then r:=r+s[i];
s:=r;
end;

//Наличие "=" в строке - принак, что она содержит параметр и значение
If Pos('=',s)>0 then
begin
v:=LowerCase(Copy(s,1,Pos('=',s)-1)); //Параметр - до "="
p:=LowerCase(Copy(s,Pos('=',s)+1,Length(s)-Pos('=',s))); //Значение - после "="

//Далее проверяем на наличие имён наших переменных
// и присваиваем им в зависимости от типа значение...
If v='b_param1' then b_param1:=GetBoolVal(p);
If v='b_param2' then b_param2:=GetBoolVal(p);
If v='b_param3' then b_param3:=GetBoolVal(p);
If v='i_param1' then i_param1:=GetIntVal(p);
If v='i_param2' then i_param2:=GetIntVal(p);
If v='e_param1' then e_param1:=GetExtVal(p);
If v='e_param2' then e_param2:=GetExtVal(p);
end;
end;

var
f: TextFile; //Файловая переменная
s: string; //Текущая строка
begin
//Открываем файл...
AssignFile(f,'test.ini');
Reset(f);
//И читаем из него строки и обрабатываем их...
while not EOF(f) do
begin
Readln(f,s);
CalcLine(s);
end;
//После - закрываем файл
CloseFile(f);

//Сам себя не похвалишь... :)
Writeln(#13#10' INI_Loader (Open Source)');
Writeln(#13#10' Copyright (c) 2003 Nabatnikov Ivan');

//Выводим все переменные...
Writeln(#13#10#13#10+
'b_param1 = '+VarToStr(b_param1)+#13+#10+
'b_param2 = '+VarToStr(b_param2)+#13+#10+
'b_param3 = '+VarToStr(b_param3)+#13+#10+
'i_param1 = '+VarToStr(i_param1)+#13+#10+
'i_param2 = '+VarToStr(i_param2)+#13+#10+
'e_param1 = '+VarToStr(e_param1)+#13+#10+
'e_param2 = '+VarToStr(e_param2)+#13+#10);

//Ждём нажатия ENTER
Write('Press [Enter]...');
Readln;
end.


Исходники: http://newff.narod.ru/pascal/iniload.rar
P.S.: В конце хочу заметить, что подобный алгоритм работы с INI-файлом я использовал в игре OXOTA2.

Уважаемые подписчики! Возможно кому-то из ваших знакомых приводимые здесь материалы очень интересны и вы можете отправить этому человеку приглашение на подписку:
Отправить приглашение подписаться.

Все вопросы и пожелания ко мне, т.е. ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru
Перепубликация допускается только с моего разрешения.
В случае, если вы будете использовать приведённые в этой рассылке коды, не забудьте сделать ссылку на мой сайт.

Ведущий рассылки:
Иван Николаевич (urisff@inbox.ru)
http://newff.narod.ru/


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное