Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
43 / 0 / 0
Регистрация: 18.12.2013
Сообщений: 21

Парсер

18.12.2013, 14:11. Показов 2819. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для небольшой текстовой игрушки в жанре RPG нужен способ считывания данных из текстовых файлов.

Итак, что мне нужно:
Из любого места в коде я должен вызывать
получить(имя_файла, секция, параметр)
например - get_date(dwarfes, gnome, money)

В файлах, примерно, вот такой вид, параметров будет много:
[npc]
name = "Имя"
zombied = false
money = 1254

Функция должна определять секцию и искать параметр именно в ней, чтобы не рыскать по всему файлу. Парсер должен определять строки, булевы значения и числа и отсекая знак равенства и имя параметра получать непосредственно значение. Пожалуйста, помогите! Желательно примером.
P.S. Я новичок, самоучка.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.12.2013, 14:11
Ответы с готовыми решениями:

Парсер на С
вопшем есть файл с текстом..... в етом файле есть какие даные(мусор)...и есть дни: Понедельник,Вторник,среда......с етого файла нада...

Парсер HTLM
Можно ли спарсить страницу что одни данные пошли в ComboBox (Имя пользователя) а ссылка (на пользователя) Была по клику? Добавлено...

Некий парсер
Допустим есть строка: 1 hour ago <span style="color: #72A326; text-shadow: 1px 1px 0px #4A7010; font-weight:...

38
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
18.12.2013, 14:45
Max Warlock, старый добрый товарищ LK. Прошу любить и жаловать.
INI - Загрузка и сохранение настроек
1
43 / 0 / 0
Регистрация: 18.12.2013
Сообщений: 21
18.12.2013, 14:53  [ТС]
Kulgar, я видел это, но не уверен, что это будет уместно, так как недостаточно хорошо разбираюсь в подобного рода делах. Не лучше ли использовать свой парсер? Как считаете?

Добавлено через 3 минуты
Нет, я посмотрел, это всё же не то, что мне нужно. Там много информации, но собрать из неё такой пример мне будет проблематично. Я хотел бы знать, как сделать именно такую функцию, как я описал выше. Отдельно.
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
18.12.2013, 15:06
Цитата Сообщение от Max Warlock Посмотреть сообщение
Kulgar, я видел это, но не уверен, что это будет уместно, так как недостаточно хорошо разбираюсь в подобного рода делах. Не лучше ли использовать свой парсер? Как считаете?
Max Warlock, глаза боятся, руки делают. Ничего сложного в этом нету. Всё что Вам нужно это указатель на файл и две функции - чтение и запись, которые различаются по типам данных.
C++
1
2
3
4
5
6
TIniFile *pIniFile;
pIniFile = new TIniFile(ExtractFilePath(Application->ExeName)+"game_settings.ini");
//...
npc.name=pIniFile->ReadString("npc","name","");
npc.zombied=pIniFile->ReadBool("npc","zombied",0);
npc.money=pIniFile->ReadInteger("npc","money",0);

Цитата Сообщение от Max Warlock Посмотреть сообщение
Нет, я посмотрел, это всё же не то, что мне нужно. Там много информации, но собрать из неё такой пример мне будет проблематично. Я хотел бы знать, как сделать именно такую функцию, как я описал выше. Отдельно.
С Вами в корне не согласен. Ибо даже пример, который Вы привели:
Цитата Сообщение от Max Warlock Посмотреть сообщение
[npc]
name = "Имя"
zombied = false
money = 1254
в точности соответсвует структуре ini файла.
1
43 / 0 / 0
Регистрация: 18.12.2013
Сообщений: 21
18.12.2013, 15:16  [ТС]
Kulgar, хорошо, я буду пробовать. Большое спасибо.
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
18.12.2013, 15:18
Max Warlock, маленькая подсказка: имена секций в [] не должны совпадать.
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
18.12.2013, 15:21
Max Warlock, вам Kulgar все верно говорит.
Всю вот эту вещь писать руками конечно можно, но если вам только оно в чем-то не подходит. Скажем быстродействие не то, функционал маленький и расширять его трудозатратнее, чем самому написать.

Цитата Сообщение от Kulgar Посмотреть сообщение
которые различаются по типам данных
Да ладно. Все в стринг загнать.
C++
1
2
3
4
5
6
7
8
String get_date( String PathAndNameToFile, String Section, int Param )
{
TIniFile *iniFile = new TIniFile( PathAndNameToFile );
String RetStr =  iniFile->ReadString( Name, Section, "" /*DefaultParam*/ );
delete iniFile;
if( Param == 75 ) return ">:]";
return RetStr;
}
1
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
18.12.2013, 15:28
SatanaXIII, Вы что?!
Вот это вот Дьявола происки!
C++
1
2
3
4
5
6
7
8
String get_date( String PathAndNameToFile, String Section, int Param )
{
    TIniFile *iniFile = new TIniFile( PathAndNameToFile );
    String RetStr =  iniFile->ReadString( Name, Section, "" /*DefaultParam*/ );
    delete iniFile;
    if( Param == 75 ) return ":)";
    return RetStr;
}
Тем более без табуляции. Ай-ай-ай.
Я через TListBox и ReadSectionValues писал. Но кто ж такой код для новичка предлагает? В бетонных ботинках с моста в реку сбрасывая плавать никого не научить... тем более опрокидывая экскаватор в догонку на голову...
0
43 / 0 / 0
Регистрация: 18.12.2013
Сообщений: 21
18.12.2013, 15:33  [ТС]
Чтобы не создавать кучу тем, задам тут же вопрос: Подскажите, стоит ли использовать ValueListEditor? Просто не хочу делать много лейблов для вывода информации. Нигде не могу найти способ, как получить определенную строку, допустим второй столбик и третью строку и заменить её значение на любое другое.

Добавлено через 2 минуты
Хорошо... что повторяться имена не должны, я понял. А можно ли создать каким-то образом простого вида наследственность, как в конфигах сталкера?

[man]
age = 30
foot = 2

[women]:man
age = 17
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
18.12.2013, 15:34
Цитата Сообщение от Kulgar Посмотреть сообщение
Вот это вот Дьявола происки!
А я то что? Система типа "черный ящик":
Цитата Сообщение от Max Warlock Посмотреть сообщение
например - get_date(dwarfes, gnome, money)
Пожалста. Бери да пользуйся.

Не по теме:

Цитата Сообщение от Kulgar Посмотреть сообщение
Тем более без табуляции.
Я художник. Я так вижу. :D



Max Warlock, к сожалению надо создавать кучу тем.
1
43 / 0 / 0
Регистрация: 18.12.2013
Сообщений: 21
18.12.2013, 15:47  [ТС]
Цитата Сообщение от SatanaXIII Посмотреть сообщение
А я то что? Система типа "черный ящик":Пожалста. Бери да пользуйся.

Не по теме:


Я художник. Я так вижу. :D



Max Warlock, к сожалению надо создавать кучу тем.
Ну, это уже в следующий раз(

Добавлено через 7 минут
При попытке работать с этой функцией (get_data): AnsiString test = get_data("data/actor.txt", "npc", name);

Третий параметр у функции может ведь быть и стринг и еще чего-нить, как быть?

Добавлено через 45 секунд
И да, какой же всё таки вариант из двух лучше? Как считаете вы?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
18.12.2013, 16:05
Цитата Сообщение от Max Warlock Посмотреть сообщение
При попытке работать с этой функцией (get_data): AnsiString test = get_data("data/actor.txt", "npc", name);
Третий параметр у функции может ведь быть и стринг и еще чего-нить, как быть?
Вот этого я не учел.
Цитата Сообщение от Max Warlock Посмотреть сообщение
И да, какой же всё таки вариант из двух лучше? Как считаете вы?
Всмысле мой или Kulgar? Да ничей. Мой это очень частный случай, а его, напротив, общий. Когда вы поймете как их сочленить, вы поймете и как себе написать пачку удобных функций.
0
43 / 0 / 0
Регистрация: 18.12.2013
Сообщений: 21
18.12.2013, 18:02  [ТС]
По какой-то причине получаю не то значение (имя не выводится, а деньги выводятся неправильно):

C++
1
2
3
 int money = get_data_int("actor", "npc", money);
 AnsiString name = get_data_str("actor", "npc", name);
 ShowMessage("У персонажа " + name + " в наличии " + money + " рублей");
Парсеры:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
String get_data_str(String filename, String section, AnsiString param)
{
  filename = "data/" + filename + ".txt";
  if (FileExists(filename))
  {
    TIniFile *iniFile = new TIniFile(filename);
    String RetStr = iniFile->ReadString(filename, section, "" /*DefaultParam*/ );
    delete iniFile;
  }
  else
  {
   ShowMessage("File not found!");
  }
}
 
int get_data_int(String filename, String section, int param)
{
  filename = "data/" + filename + ".txt";
  if (FileExists(filename))
  {
    TIniFile *iniFile = new TIniFile(filename);
    int RetStr =  iniFile->ReadInteger(filename, section, 0);
    delete iniFile;
  }
  else
  {
   ShowMessage("File not found!");
  }
}
Содержимое файла:
[npc]
name = "Шрам"
zombied = false
money = 1254
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
18.12.2013, 18:09
Max Warlock, результат возвращать через return кто будет?
1
43 / 0 / 0
Регистрация: 18.12.2013
Сообщений: 21
18.12.2013, 18:20  [ТС]
UI, В.И.Ленин(((
Спасибо, я балбес, но я учусь)))

Добавлено через 3 минуты
Чёрт, он выдаёт деньги как 0 теперь, а имя вообще не выдаёт.

Добавлено через 1 минуту
Я предполагаю, что это из-за того, что значение передаётся не напрямую через ини_файл, а сначала в парсер. Шо делать?(
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
18.12.2013, 18:32
На исправленный код посмотреть можно?
0
43 / 0 / 0
Регистрация: 18.12.2013
Сообщений: 21
18.12.2013, 19:14  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
String get_data_str(String filename, String section, AnsiString param)
{
  filename = "data/" + filename + ".txt";
  if (FileExists(filename))
  {
    TIniFile *iniFile = new TIniFile(filename);
    String RetStr = iniFile->ReadString(filename, section, "" /*DefaultParam*/);
    delete iniFile;
    return RetStr;
  }
  else
  {
   ShowMessage("ERROR: File not found!");
  }
}
 
int get_data_int(String filename, String section, int param)
{
  filename = "data/" + filename + ".txt";
  if (FileExists(filename))
  {
    TIniFile *iniFile = new TIniFile(filename);
    int RetStr =  iniFile->ReadInteger(filename, section, 0);
    delete iniFile;
    return RetStr;
  }
  else
  {
   ShowMessage("ERROR: File not found!");
  }
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
18.12.2013, 19:23
Первый параметр у функций Read... - это название секции, второй - название идентификатора, который надо из этой секции прочесть. Что ты передаешь? Первый параметром - имя файла, вторым - название секции? Вот у тебя и не совпадает фактический результат с ожидаемым...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
String get_data_str(String filename, String section, String param)
{
    filename = "data/" + filename + ".txt";
    if (FileExists(filename))
    {
        TIniFile *iniFile = new TIniFile(filename);
        String RetStr = iniFile->ReadString(section, param, "");
        delete iniFile;
        return RetStr;
    }
    else
    {
        ShowMessage("ERROR: File not found!");
    }
}
 
int get_data_int(String filename, String section, String param)
{
    filename = "data/" + filename + ".txt";
    if (FileExists(filename))
    {
        TIniFile *iniFile = new TIniFile(filename);
        int RetStr = iniFile->ReadInteger(section, param, 0);
        delete iniFile;
        return RetStr;
    }
    else
    {
        ShowMessage("ERROR: File not found!");
    }
}
 
// читаем
    int money = get_data_int("actor", "npc", "money");
    AnsiString name = get_data_str("actor", "npc", "name");
    ShowMessage("У персонажа " + name + " в наличии " + money + " рублей");
1
43 / 0 / 0
Регистрация: 18.12.2013
Сообщений: 21
19.12.2013, 08:32  [ТС]
UI, спасибо огромное!)

Добавлено через 11 часов 13 минут
Подскажите, как объединить эти два недопарсера в один?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
String get_data_str(String filename, String section, String param)
{
    filename = "data/cfg/" + filename + ".dat";
    if (FileExists(filename))
    {
        TIniFile *iniFile = new TIniFile(filename);
        String RetStr = iniFile->ReadString(section, param, "");
        delete iniFile;
        return RetStr;
    }
    else
    {
        ShowMessage("ERROR! File not found: database!");
    }
}
 
int get_data_int(String filename, String section, String param)
{
    filename = "data/cfg/" + filename + ".dat";
    if (FileExists(filename))
    {
        TIniFile *iniFile = new TIniFile(filename);
        int RetStr = iniFile->ReadInteger(section, param, 0);
        delete iniFile;
        return RetStr;
    }
    else
    {
        ShowMessage("ERROR! File not found: database!");
    }
}
Всего одной строчкой различаются... Может передавать вместе с параметрами ещё и тип (int или string)? Или оставить как есть?

Добавлено через 2 минуты
Хотя... Похоже, никак(
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
19.12.2013, 09:18
Цитата Сообщение от Max Warlock Посмотреть сообщение
Подскажите, как объединить эти два недопарсера в один?
Вообще зачем Вам подобное делать? Работа с ini файлом актуальна при двух событиях - запуск программы и её закрытие. Или у Вас на столько большой объём данных, что держать его в памяти не представляется возможным?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2013, 09:18
Помогаю со студенческими работами здесь

Парсер выражений
Здравствуйте, помогите пожалуйста написать простой парсер, для дальнейшей самостоятельной доработки под нужды. Ссылки на гугл и прочее не...

Парсер сайтов
Доброго времени суток. У меня возник вопрос. Делаю парсер, вынимает из сайта то что мне надо это без вопросов... Но проблема в следующем,...

Парсер HTML
Здравствуйте! Нигде не могу найти парсера HTML на Си/С++, помогите кто чем может! На PHP все просто выходит в две строки, но надо...

Парсер IP пакета
Здравствуйте. Необходима помощь. Имеется программа которая с помощью функции pcap_loop разбивает файл xxx.pcap созданный в wireshark на...

Парсер boost/regex
Всем привет вот возникла сложно с boost/regex начну по порядку. Написав достаточное количество парсеров информации из интернета я понял...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru