Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> По чтению текстовых файлов.... 
:(
    Опции темы
Sniper
Дата 3.3.2004, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Значит нужно прочитать файл типа конфиг!
такие для игр делают типа:

wireframe off
snd_freq 22khz
vid_bpp 16
vid_mode 1024x768

Т.е конфиг может изменяться
on изменяться на off
22khz изменяться на 44khz
16 изменяться на 32
1024x768 может изменяться на 800x600 а то и на 640x480

Как это сделать РАЦИОНАЛЬНО!!!???




--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Pakshin A. S.
Дата 3.3.2004, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



1) Завести INI
2) Поработать со строкой, т. е. копировать всё, после пробела, а далее if, изменение и т. п.
PM   Вверх
Maverick
Дата 3.3.2004, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



INI, конечно, хорошо.... спору нет....
а неудобнее ли табличкой воспользоваться?


--------------------
smile
PM ICQ GTalk   Вверх
Sniper
Дата 3.3.2004, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Цитата(Pakshin @ 3.3.2004, 16:57)
1) Завести INI
2) Поработать со строкой, т. е. копировать всё, после пробела, а далее if, изменение и т. п.

Да я вот и спрашиваю как культурно реализовать пункт №2
строки же местами могут меняться!


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Гость_Vasya
Дата 3.3.2004, 20:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну, я сделал бы так:

type
TConfig = record
wireframe: Boolean;
snd_freq: Integer;
vid_bpp: Integer;
vid_mode_x: Integer;
vid_mode_y: Integer;
end;

Далее для записи его в файл:

FileStr: TFileStream;
Config: TConfig;


with Config do begin
Тут отутюживаем Config
end;

FileStr := TFileStream.Create('Conf.cgf', fmOpenWrite);
FileStr.WriteBuffer(Config, SizeOf(Config));
FileStr.Free;

И читаем:
FileStr.ReadBuffer(Config, SizeOf(Config));




  Вверх
Pakshin A. S.
Дата 3.3.2004, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Цитата(Sniper @ 3.3.2004, 21:04)
Цитата(Pakshin @ 3.3.2004, 16:57)
1) Завести INI
2) Поработать со строкой, т. е. копировать всё, после пробела, а далее if, изменение и т. п.

Да я вот и спрашиваю как культурно реализовать пункт №2
строки же местами могут меняться!

Открой любую статейку по работе состроками, глянь в FAQ'и. Попробуй разобраться сам, ну а если не получится, что заставляет задуматься, напишем...
PM   Вверх
Sniper
Дата 3.3.2004, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Я могу только так написать ;-(

wireframe
off
snd_freq
22khz
vid_bpp
16
vid_mode
1024x768

Более того оно написано и работает! wink.gif


procedure LoadUserConfig;
var
Fconfig: TextFile;
S: String;
begin
AssignFile(fconfig,'user.cfg');
Reset(fconfig);
while not EOF(fconfig) do
begin
Readln(fconfig,s);
if s = 'rs_fullscreen' then
begin
Readln(fconfig,s);
if s = 'on' then
rs_fullscreen := true;
if s = 'off' then
rs_fullscreen := false;
end;
if s = 'rs_wireframe' then
begin
Readln(fconfig,s);
if s = 'on' then
rs_wireframe := true
else
rs_wireframe := false;
end;
end;
end;


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
z-END
  Дата 3.3.2004, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



Вот мой вариант решения:
1. обявим новый тип и ее переменную:
Код
Type TGameOption = Record
           cmd: String;
           value: String;
       end;
...
var
go: TGameOption;


2. Создадим функцию
Код
Function GetGO (Line: String): TgameOption;
var
symb: Char;
begin
symb := ' ';
// если данные хранятся в виде "command value"
//если  в виде "command=value" то замените symb :='=';
Result.cmd := trim (Copy (Line, 1, (Pos (symb, Line)));
Result.value := trim (Copy (Line, (Pos (symb, Line), length(Line)));
end;

3. в теле самой программы такой цикл:
Код
AssignFile (FConfig, 'user.cfg');
Reset (FConfig);
while not EOF (FConfig) do
begin
Readln (FConfig, s);
GO := GetGo(s);
// обрабатываем варианты комманд
if Go.cmd="..." then
                            begin
                               if Go.value="..."  then SomeVar := "...";
                                    {...}
                               if Go.value =".."  then SomeVar := "...";
                            end;

end;
CloseFile (FConfig);

Я не проверял, так что может вариант и нерабочийsmile.gif
ps а вообще-то наверное проще через форматирование строки т.е. RegEx smile.gif но в них я "0"



--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
remax
Дата 3.3.2004, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Можно конечно и с текстовыми файлами играться smile.gif , но проще использовать готовый инструмент - Ини-файлы. В Делфи для этого уже все есть в модуле IniFiles. hehe.gif hehe.gif hehe.gif

Процедура для чтения из ини-файла

Код

uses IniFiles;

procedure LoadFromIni(iName:string);
var
 IniFile:TIniFile;
 s:string;
 i:integer;
 b:boolean;
begin
 IniFile:=TIniFile.Create(iName);
 s:=Trim(inifile.readstring('main','snd_freq',''));
 i:=inifile.readinteger('main','vid_bpp',0);
 b:=inifile.readbool('main','vid_bpp',false);
 IniFile.Free;
end;



Процедура для записи в ини-файла

Код

procedure SaveToIni(iName:string);
var
 IniFile:TIniFile;
 s:string;
 i:integer;
 b:boolean;
begin
 IniFile:=TIniFile.Create(iName);
 inifile.writestring('main','snd_freq',s);
 inifile.writeinteger('main','vid_bpp',i);
 inifile.writebool('main','vid_bpp',b);
 IniFile.UpdateFile;
 IniFile.Free;
end;


p.s. возможны мелкие ошибки - написано без проверки на делфи

Это сообщение отредактировал(а) remax - 3.3.2004, 22:00


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Sniper
Дата 3.3.2004, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Я вообще не знал про такую функцию как "trim"! ;-(
Позор мне и порицание!


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Sniper
Дата 3.3.2004, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



remax Да Ini файлами я пользоваться умею....(все равно спасибо что написал! wink.gif) я хотел сделать так как это делает большенство! wink.gif


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
remax
Дата 3.3.2004, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Цитата(Sniper @ 3.3.2004, 18:51)
я хотел сделать так как это делает большенство! wink.gif

В каком смысле "большинство"?

Это сообщение отредактировал(а) remax - 3.3.2004, 22:04


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Sniper
Дата 3.3.2004, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Цитата(remax @ 3.3.2004, 19:02)
Цитата(Sniper @ 3.3.2004, 18:51)
я хотел сделать так как это делает большенство! wink.gif

В каком смысле "большинство"?

Впрямом! У всех игрушек конфиги сделаны по такому принципу
Quake III
CS
DOOM III
S.T.A.L.K.E.R.


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Cheba
Дата 3.3.2004, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



2 Sniper
Цитата
... S.T.A.L.K.E.R. ...
Откуда тебе знать какие там конфиги? Еще даже демки нет, а ты про конфиги говоришь... smile.gif
PM MAIL ICQ   Вверх
Medved
Дата 3.3.2004, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Модератор: Давайте вернемся к теме обсуждения.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Unregistered
Дата 4.3.2004, 09:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Sniper
Используй типизированные файлы
  Вверх
SlaUr
Дата 4.3.2004, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



Вот мое решение : скачать юнит для работы со строками Unit MyStr

(ошибки в процедурах не обработаны)

Код

uses mystr;
type TConfig = record
       wireframe: Boolean;
       snd_freq: Integer;
     vid_bpp: Integer;
     vid_mode_x: Integer;
     vid_mode_y: Integer;
     end;
var Myconf:TConfig;F1:Text;

Procedure ReadMyconf;
var st1:string;
begin
With MyConf do
begin

    wireframe:=False;{инициилизировать и другие переменные в типе TConfig}

Assign(F1,'myconf.cfg');Reset(F1);
  While not eof(f1) do  
    begin
       ReadLn(F1,St1);
       if NFi(1,st1)='wireframe' then
            if Nfi(2,St1)='Yes' then  wireframe:=True;
       if NFi(1,st1)='snd_freq' then snd_freq:=StrToInt(Nfi(2,St1))
       if NFi(1,st1)='vid_bpp' then vid_bpp:=StrToInt(Nfi(2,St1))
       if NFi(1,st1)='vid_mode_x' then vid_mode_x:=StrToInt(Nfi(2,St1))
       if NFi(1,st1)='vid_mode_y' then vid_mode_y:=StrToInt(Nfi(2,St1))
 
    end;
Close(F1);
end;
end;




Procedure WriteMyconf;
var St1:string;
begin
With MyConf do
begin
  Assign(F1,'myconf.cfg');Rewrite(F1);
  if wireframe then  WriteLn(F1,'wireframe Yes') else WriteLn(F1,'wireframe No');
  WriteLn(F1,'snd_freq   '+IntToStr(snd_freq));
  WriteLn(F1,'vid_bpp   '+IntToStr(vid_bpp));
  WriteLn(F1,'vid_mode_x   '+IntToStr(vid_mode_x));
  WriteLn(F1,'vid_mode_y   '+IntToStr(vid_mode_y));
  Close(F1);
end;
end;


Пояснение: Function NFi(index:integer;StrInp:string):String;
Возращает слово под номером index из строки StrInp ( независимо от количества пробелов между словами)

Если надо считывать например путь к файлу(он может содержать пробелы ,то вместо NFi(2,'mypath') нужно считывать функцией
NFe(2,'mypath')

IMHO самый простой способ для работы с INI файлами ,без использования юнита IniFiles.

p.s Возможны ошибки-компилировать не пробовал

Это сообщение отредактировал(а) SlaUr - 4.3.2004, 12:25
PM MAIL   Вверх
z-END
Дата 4.3.2004, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



Так нужно-то что, прочесть / изминить уже имеющийся конфиг?
если так, и ктомуже известны все возможные ключи=значения конфига, то можно через константы делать


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Pakshin A. S.
Дата 4.3.2004, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



А повыпендриваться с нетипизированными файлами никто не хочет, вещь прикольная biggrin.gif
PM   Вверх
remax
Дата 4.3.2004, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Цитата(Pakshin @ 4.3.2004, 17:29)
А повыпендриваться с нетипизированными файлами никто не хочет, вещь прикольная biggrin.gif

А что прикольного - ну чуть быстрее операции чтения/запись, так на таких маленьких файлах разницы не почувствовать- доли секунды все-таки. tounge.gif tounge.gif
Проблем чуть поболее, но ничего особенного - работаем только не с набором строк, а с массивом байт (или char). Соответственно, при обработке используем не строковые функции, а операции с массивами.

P.S. С помощью нетипизированного типа файлов вполне можно общаться и с обычными текстовыми, не забывая что #13#10 обозначают перевод строки. biggrin.gif biggrin.gif

Это сообщение отредактировал(а) remax - 4.3.2004, 20:45


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Fantasist
Дата 4.3.2004, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Что-то выпендрежа не догоняю. Такие задачи решаются либо IniFile'aми, либо (что считается более продвинутым) работой с реестром (TRegistry). В некоторых случаях TStream (TFileStream, в частности) - запись и считывание в бинарном виде. Но хранить настройки в бинарном виде вряд ли хороший подход.

[offtopic]
remax, от твоей собачки я просто балдею smile.gif.
[/offtopic]


--------------------
Волны гасят ветер...
PM MAIL   Вверх
remax
Дата 4.3.2004, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Цитата(Sniper @ 3.3.2004, 19:27)
У всех игрушек конфиги сделаны по такому принципу
Quake III
CS
DOOM III
S.T.A.L.K.E.R.

В течении 5 минут было проведено экспресс исследование имеющихся в офисе игр:

Используют INI файлы:
LOTR The Return of the King
Heroes of Might and Magic™ IV
Rig&Roll

Использует CFG файлы:
Call of Duty

Использует свой формат файла конфигурации:
Broodwar
Cossacs

Использует INI и типа CFG файлы:
The Sims

Вероятно, все они в той или иной мере используют реестр. По крайней мере Windows игрушки типа Сапера именно в реестр пихают всю информацию.

Так что это спорный вопрос, какой формат для хранения настроек использует "большинство".

P.S. Результаты поиска по расширению на отдельно взятом компе (два виндовс, делфи, офис, игрушки):

INI: 310 файлов
CFG:140 файлов
CNF:18 файлов









--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
SlaUr
Дата 5.3.2004, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



Если не хотите чтобы рядовые пользователи изменяли параметры настройки в ручную (а только из программы) - использовать cfg -файлы ,иначе - ini (Дополнильная возможность тонкой настройки программы) .

PM MAIL   Вверх
remax
Дата 5.3.2004, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Вручную можно править все!

INI и CFG одинаково легко, и намного легче чем бинарные файлы!





--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
SlaUr
Дата 5.3.2004, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



remaxcfg я имел ввиду типизированные файлы и как его править без hex-редактора ?
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0736 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.