Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

разобрать секцию из ini файла
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Tue Aug 30, 2005 17:13    Post subject: разобрать секцию из ini файла Reply with quote

потребовалось разобрать секцию из wincmd.ini [PackerPlugins]

нашел только такую функцию
//*************************
The GetPrivateProfileSection function retrieves all of the keys and values for the specified section from an initialization file. This function is provided for compatibility with 16-bit applications written for Windows. Win32-based applications should store initialization information in the registry.

Windows 95: The specified profile section must not exceed 32K.

Windows NT: The specified profile section has no size limit.

DWORD GetPrivateProfileSection(
LPCTSTR lpAppName, // address of section name
LPTSTR lpReturnedString, // address of return buffer
DWORD nSize, // size of return buffer
LPCTSTR lpFileName // address of initialization filename
);
//*************************

может уже есть у кого готовый быстрый и отработанный разбор текста lpReturnedString на массив КЛЮЧЕЙ-ЗНАЧЕНИЙ.
Back to top
View user's profile Send private message
vserd



Joined: 26 Apr 2005
Posts: 118

Post (Separately) Posted: Mon Sep 05, 2005 11:22    Post subject: Reply with quote

Parcan
Если программируешь в Delphi тогда воспользуйся Tstringlist.Values[]
сам так делал не однократно.
Если на C++ тогда не знаю. Потребность еще не возникала.
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Mon Sep 05, 2005 15:54    Post subject: Reply with quote

vserd
я пишу исключительно на с++ (по работе 1с буква "с" мне уж больно нравится Smile ), да и написать знаю как - но всеравно время надо, я человек дотошный (дева по задиаку) пока все не проверю не отстану от кода
только я видел несколько программ и плагинов где это 100% реализовано, думал кто-нить из авторов тут есть
Back to top
View user's profile Send private message
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Mon Sep 05, 2005 16:06    Post subject: Reply with quote

На Дельфе с помощью TIniFile - как два пальца об асфальт это делается... Сосбсно, возьми дельфовский юнит, переведи на C++, там ничего сложного, и будет легко и весело. Секции в StringList читаются одной командой, а уж со стринглистом работать элементарно (это я всё про дельфю)
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Mon Sep 05, 2005 16:51    Post subject: Reply with quote

Parcan
Quote:
только я видел несколько программ и плагинов где это 100% реализовано, думал кто-нить из авторов тут есть

Может и есть, да толку-то? Я, например, реализовывал у себя подобную штуку на C++, но выдернуть код не так-то просто. Я его отдельно не оформлял...
Там можно такой трюк использовать: раз строка нулём заканчивается, можно не разбивать ничего, а просто обращаться прямо по нужному указателю - всякие strlen'ы и им подобные нормально отработают. А потом полученную длину к указателю прибавляешь (может, +1 ещё) - и получаешь сразу же указатель на следующую строку, и так далее, пока не наткнёшься на повторный нолик. Релизуется элементарно, минут 10 код писать. Я бы набросал, просто на работе сидю... Smile
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Mon Sep 05, 2005 17:36    Post subject: Reply with quote

CaptainFlint
Quote:
штуку на C++, но выдернуть код не так-то просто. Я его отдельно не оформлял

а ты объектный подход не практикуешь?
я как на втором курсе изучил, так все так и делаю у меня даже для работы с ини файлом класс есть (строчек на 15) вот надо дописать такой метод
Quote:
минут 10 код писать

у меня обычно каркас по быстрому настрочишь, а потом раза в 3 дольше проверяешь все а как работает на ошибочных данных а как на полном извврате себя ведет Smile
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Mon Sep 05, 2005 18:24    Post subject: Reply with quote

Parcan
Quote:
а ты объектный подход не практикуешь?

Практикую, но не настолько же! Smile Лишние разбиения - понижение эффективности. Я больше кода потрачу для обёртки функции и потеряю на передаче параметров и обработке ошибок... Smile В общем, вот код, нашёл тут у себя копию:
Code:
const int BufSize = 65536;
char AllKeys[BufSize];
int CharsRead = GetPrivateProfileSection("Section", AllKeys, BufSize, FullPath);
if (CharsRead > 0)
{
   char* tmp = AllKeys;
   char* eq_sign;
   while (*tmp)
   {
      if (*tmp == ';')   // Пропускаем комментарии
      {
         tmp += strlen(tmp) + 1;
         continue;
      }
      eq_sign = strstr(tmp, "=");
      if (eq_sign != NULL)
      {
         *(eq_sign++) = '\0';
         printf("Key: %s, value: %s\n", tmp, eq_sign);
         tmp = eq_sign + strlen(eq_sign) + 1;
      }
      else            // Пропускаем строки без знака '='
         tmp += strlen(tmp) + 1;
   }
}

Не знаю, мне такие простые вещи не кажутся требующими создания отдельных класов... Smile
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Nik



Joined: 01 Jan 2005
Posts: 583
Location: Киров

Post (Separately) Posted: Mon Sep 05, 2005 18:49    Post subject: Reply with quote

Если я все правильно понял, то можно использовать следующий алгоритм (функция проверена на Delphi 7/2005, используется в моем AmpView, работает стабильно и довольно шустро). Никаких дополнительных модулей не надо (TIniFile я вообще никогда не использую).

Code:
function ReadIniSection(const Section: string; FileName: string): TStringList;
const
  BufSize = 16384;
var
  Buffer, P: PChar;
begin
  result:=TStringList.Create;
  GetMem(Buffer, BufSize);
  try
    result.BeginUpdate;
    try
      result.Clear;
      if GetPrivateProfileString(PChar(Section), nil, nil, Buffer, BufSize,
        PChar(FileName)) <> 0 then
      begin
        P := Buffer;
        while P^ <> #0 do
        begin
          result.Add(P);
          Inc(P, StrLen(P) + 1);
        end;
      end;
    finally
      result.EndUpdate;
    end;
  finally
    FreeMem(Buffer, BufSize);
  end;
end;
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Mon Sep 05, 2005 19:01    Post subject: Reply with quote

Вот, кстати говоря, почему я не всё выделяю в отдельные методы: кому-то надо распарсить ключи и выделить их в массив, кому-то - в список, кому-то вообще не надо выделять, а, как у меня, сделать с каждым одну-единственную операцию, после чего выбросить и забыть (в общем случае можно организовать в виде callback-функции)... Так что, напишешь одним способом - а в следующий раз потребуется другой. А писать сразу все возможные реализации вместо одной конкретной, требующейся сейчас - на это у меня далеко не всегда хватает мужества. Very Happy
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Tue Sep 06, 2005 09:19    Post subject: Reply with quote

CaptainFlint
Nik
спасибо

CaptainFlint
кстати по коду получается что strlen(string) дает длину не только по \0 но и по \n, честно говоря не знал Sad
Quote:
*(eq_sign++) = '\0';

красиво сразу не понял
Quote:
Практикую, но не настолько же! Лишние разбиения - понижение эффективности. Я больше кода потрачу для обёртки функции и потеряю на передаче параметров и обработке ошибок...

ну в данном случае работа с ини-файлом нужна обычно в начале работы программы и в конце, а учитывая время обращения к файлу на диске эти затраты будут почти нулевыми, а вообще наиболее часто используемые методы обычно находятся в этом же классе... я считаю, что удобство от использования классов намного больше чем потери в вызове методов (я свои почти никогда не переписываю у меня многие классы на момент написания оказываются избыточными, но зато в другой раз ничего дописывать не приходится).
Для меня единственное что является страшным, так это виртуальные методы при наследовании и классы шаблоны при частом использовании.
Quote:
Не знаю, мне такие простые вещи не кажутся требующими создания отдельных класов...

Я вот даже счетчик бы засунул в отдельный класс с одним единственным методом, хотя может это и перебор Smile
Можно сравнить с языком описния аппаратуры VHDL или Verilog там что бы ты не описывал это устройство (хоть и маленькое) и создаешь там архитектуры - аналоги классов... так вот до ознакомления с VHDL я еще использовал порой функции, но там мне так понравилось (практически визуально объектная модель), что я и в щах стал писать так же.

ЗЫ. ладно разговорился что-то
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Tue Sep 06, 2005 09:23    Post subject: Reply with quote

CaptainFlint
а вообще мне твой код понравился... блин делается все в 3-х строчках ... я бы написал больше кода
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Tue Sep 06, 2005 09:31    Post subject: Reply with quote

Quote:
кстати по коду получается что strlen(string) дает длину не только по \0 но и по \n, честно говоря не знал

все глянул MSDN понятно
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Tue Sep 06, 2005 10:24    Post subject: Reply with quote

Parcan
Quote:
кстати по коду получается что strlen(string) дает длину не только по \0 но и по \n, честно говоря не знал

Quote:
все глянул MSDN понятно

А в чём был вопрос? Насколько мне известно, никакой \n не служит ограничителем для strlen...
А, ты, видимо, сначала подумал, что отдельные ключи разделяются через \n, а не через \0?
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Tue Sep 06, 2005 12:07    Post subject: Reply with quote

CaptainFlint
да
я прочитал описание функции самое начало - написано, что в строку будет возвращено все содержимое секции, ну и логично предположил, что строка заканчивается \n
а потом прочитал дальше, что возвращается одна или несколько нультерминированных строк и последняя имеет повторный \0
Back to top
View user's profile Send private message
KindDragon



Joined: 20 Oct 2005
Posts: 1

Post (Separately) Posted: Thu Oct 20, 2005 09:45    Post subject: Reply with quote

Кстати вот тут неплохой класс для работы с Ini файлами в VS
http://www.codeproject.com/cpp/ciniex.asp
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group