Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск значений переменных внутри файла, Очень нужна помощь! 
V
    Опции темы
ReGeDiT
  Дата 4.7.2006, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



суть программы:
внутри файла x.x есть блоки с переменными:
Код

[block 1]
string0=5000
string1=1000
string2=2000
string3=3000
string4=4000

[block 2]
string0=5000
string1=3000
string2=1000
string3=3000
string4=4000

[block 3]
string0=5000
string1=2000
string2=1000
string3=3000
string4=4000

в каждом блоке надо сравнить string1 и string2 smile если string1 > string2 сделать их равными и указать в каком блоке мы сделали изменения...
проблема возникает при определении значений string1 и string2 smile. Незнаю как это реализовать.

моя ужасная программа smile :

Код

#include <stdio.h>
#include <conio.h>
#include <string.h>

FILE *fp;

void main(void)
{
char st[7];
char stra[7];
stra[0]='s';
stra[1]='t';
stra[2]='r';
stra[3]='i';
stra[4]='n';
stra[5]='g';
stra[6]='1';
stra[7]='=';
char strb[7];
strb[0]='s';
strb[1]='t';
strb[2]='r';
strb[3]='i';
strb[4]='n';
strb[5]='g';
strb[6]='1';
strb[7]='=';
int vl1,vl2;
fp=fopen("x.x","r");
clrscr();
do {
    fscanf(fp,"%s",&st);
    printf("%s\n",st);
    if (st==stra) { scanf("%d",&vl1); printf("%d\n",vl1); };
    if (st==strb) { scanf("%d",&vl2); printf("%d\n",vl1); };
   }
while (!feof(fp));
getch();
fclose(fp);
}
 
PM MAIL WWW ICQ   Вверх
Fedor
Дата 4.7.2006, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


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

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



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


В общем, делаешь так: читаешь всю строку, вырезаешь в ней все до равенства и сравниваешь со "string1". Если это действительно string1, вырезаешь все что после знака равенства и запоминаешь в переменную. (строки копируются функцией strcpy, или strncpy)
Таким же образом находишь string2.
Когда нашел string2, сравниваешь значения с помощью strcmp.


З.Ы. Может, есть красивее решение, но на несвежую голову придумал вот такое простое.  

Это сообщение отредактировал(а) Fedor - 4.7.2006, 23:17


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Fazil6
Дата 4.7.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



если в винде, то используй API
Код

UINT GetPrivateProfileInt(
  LPCTSTR lpAppName,
  LPCTSTR lpKeyName,
  INT nDefault,
  LPCTSTR lpFileName
);


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


Шустрый
*


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

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



Fedor
Oo хм... про идею с первыми символами это неплохо, но мне сказали что такая фишка не прокатит с переменной типа %s smile

Код

int kol = 8;
do {
    fscanf(fp,"%s",&st);
    printf("%s\n",st);
    if (strncmp(st,"string1=",kol)==0) {  /* а как тогда тут считать что мне надо? т.е. значения... */ };
    if (strncmp(st,"string2=",kol)==0) {  /* а как тогда тут считать что мне надо? т.е. значения... */ };
   }


пока что-то вроде этого... smile 
PM MAIL WWW ICQ   Вверх
ReGeDiT
Дата 4.7.2006, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Fedor, ах да, strcmp ведь будет сравнивать только char значения, у меня задача перевести значения после "=" в %d (int) smile
и как вырезать всё ПОСЛЕ "string1="? smile 
PM MAIL WWW ICQ   Вверх
ptr
Дата 5.7.2006, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Ну можешь например так получить значения:
Код

atoi(strstr(string,"=")+1);
  

Это сообщение отредактировал(а) ptr - 5.7.2006, 07:03


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Rockie
Дата 5.7.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



ptr, точно.

ReGeDiT, вот полный пример
Код
#include<iostream>
#include<conio>

using namespace std;

int main()
{
  char * string = "string1=5000";
  int number = atoi(strstr(string,"=")+1);

  cout<<number;

  getch();
  return 0;
}



Цитата(ReGeDiT @  4.7.2006,  23:29 Найти цитируемый пост)
 но мне сказали что такая фишка не прокатит с переменной типа %s 

похоже рекомендуют использовать строки (string.h). кто может подсказать грамотное преобразование string в int? то есть доделать что-то вроде этого
Код
#include<iostream>
#include<conio>

using namespace std;

int main()
{
  string str = "string1=9000", str_num;
  int number = 0, lenght;

  lenght = str.length();   // длина всей строки

  // вырезаем число от знака '=' и до конца строки
  str_num = str.substr(str.find("=")+1,lenght);

  // пареобразование string str_num в int number

  cout<<number;

  getch();
  return 0;
}


компилятор BCBuilder 6

p.s.: вообще странно но я не нашел ничего вроде StrToInt из AnsiString  но для string. 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Oleg_Ci
Дата 5.7.2006, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

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



Сочинил програмку, Borland C++ Builder 6.
Код

#include <iostream>
#include <string>
#include <fstream>
#include <stdlib.h>
using namespace std;

int number(string buffer, int pt)
{
  int num=0;
  string s;

  for (;;pt++)
    if ( buffer[pt]>47 && buffer[pt]<58 )
      s+=buffer[pt];
    else break;

  num = atoi(s.c_str());
  return num;
}

int main()
{
  ifstream fin("txt.txt");
  if (!fin.is_open())
    return 1;

  string buffer;
  int pt=0, num1, num2;
  getline(fin, buffer, '\0');
  fin.close();

  while(1)
  {
    pt=buffer.find("block ",pt); if(pt==string::npos)break;
    pt += 6;
    cout<<"block "<<number(buffer, pt)<<endl;

    pt=buffer.find('=',pt); if(pt==string::npos)break;
    pt++;
    num1 = number(buffer, pt);
    pt=buffer.find('=',pt); if(pt==string::npos)break;
    pt++;
    num2 = number(buffer, pt);

    cout<<num1<<endl<<num2<<endl;

    if ( num1 > num2 )
    { /* что-то делаем */; }
  }
  cin.get();
  return 0;
}
  

Это сообщение отредактировал(а) Олег4 - 5.7.2006, 17:54
PM MAIL   Вверх
ReGeDiT
Дата 5.7.2006, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо огромное... вопрос почти решён )) признаю что я делаю программу под один из серверов игры WoW...
вот что я наделал:
Код

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

FILE *fp,*lg;

void main(void)
{
char st[7];
clrscr();
int vl0,vl1,vl2,dif;
char *name[99];
lg=fopen("log.log","w+");
fprintf(lg,"NM : Item Name\nBP : Buy Price\nSP : Sell Price\nDF : Difference\n\n\n",*name,vl1,vl2,dif);
fclose(lg);
fp=fopen("x.x","r");
do {
    /*************************************/
    fscanf(fp,"%s",&st);
    /*************************************/
    if (strncmp(st,"name=",5)==0)        {
    *name=(strstr(st,"=")+1);
    printf("name=%s\n",*name);             };
//    if (strncmp(st,"name=",5)==0) *name=st;
    /*************************************/
    if (strncmp(st,"[item ",6)==0)       {
    vl0=atoi(strstr(st," ")+1);
    printf("[item %d]\n",vl0);             };
    /*************************************/
    if (strncmp(st,"buyprice=",9)==0)    {
    vl1=atoi(strstr(st,"=")+1);
    printf("buyprice=%d\n",vl1);         };
    /*************************************/
    if (strncmp(st,"sellprice=",10)==0)  {
    vl2=atoi(strstr(st,"=")+1);
    printf("sellprice=%d\n",vl2);
    dif=vl2-vl1;
    if (vl1==vl2)
      { printf("SELLPRICE == BUYPRICE! ADDED TO LOG!\n");
    lg=fopen("log.log","a");
    fprintf(lg,"NM=%s BP=%d SP=%d DF=%d\n",*name,vl1,vl2,dif);
    fclose(lg);
      };
    if (vl2>vl1)
      { printf("SELLPRICE >> BUYPRICE! ADDED TO LOG!\n");
    lg=fopen("log.log","a");
    fprintf(lg,"NM=%s BP=%d SP=%d DF=%d\n",*name,vl1,vl2,dif);
    fclose(lg);
      };                                 };
    /*************************************/
    if (feof(fp)) { printf("We have reached end-of-file\n"); fclose(fp); };
   } while (!feof(fp));
}


файл x.x
Код


#include scripts/extra/items_LF.scp

[item 18]
name=Spirit Of The Wind
class=0
reqlevel=10
quality=1
buyprice=140
sellprice=35
bonding=1
classes=07FFF
model=15748
level=20
races=01FF
stackable=5
material=3
spell=16618 0 -1 0 4 120000

[item 19]
name=Agamaggan's Agility
class=0
reqlevel=10
quality=1
buyprice=140
sellprice=35
bonding=1
classes=07FFF
model=15748
level=20
races=01FF
stackable=5
material=3
spell=17013 0 -1 0 4 120000

[item 20]
name=Agamaggan's Strength
class=0
reqlevel=10
quality=1
buyprice=140
sellprice=35
bonding=1
classes=07FFF
model=15748
level=20
races=01FF
stackable=5
material=3
spell=16612 0 -1 0 4 120000

[item 1000]
name=ShitFuckI
class=0
reqlevel=10
quality=1
buyprice=1001
sellprice=2001
bonding=1
classes=07FFF
model=15748
level=20
races=01FF
stackable=5
material=3
spell=16618 0 -1 0 4 120000

[item 1001]
name=ShitFuckII
class=0
reqlevel=10
quality=1
buyprice=1333
sellprice=1999
bonding=1
classes=07FFF
model=15748
level=20
races=01FF
stackable=5
material=3
spell=16618 0 -1 0 4 120000

[item 1002]
name=ShitFuckIII
class=0
reqlevel=10
quality=1
buyprice=1000
sellprice=1000
bonding=1
classes=07FFF
model=15748
level=20
races=01FF
stackable=5
material=3
spell=16618 0 -1 0 4 120000


в последних трёх спецово даны неправильные значения... НО!!! почемуто в логе потом появляется что-то ужасное smile( вместо названия ужос, также немогу определить [item ID] smile вот 2 вопроса остались...

З.Ы. Начал пробовать перегонять всё под Visual C++ 7.0 Net >> удивился, но обычный импорт кода и программа работоспособна... теперь подскажите или дайте ссылку куданить на создание простейших видов интерфейса... или чтонить типа "Visual С++ для лашей" )) 
PM MAIL WWW ICQ   Вверх
ReGeDiT
Дата 5.7.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ыы и сорри, оверпостинг .... =) но кстати у меня даже после сканирования всего файла и дохождения до EOF (конца...) программа всеравно гоняет по файлу, и ни в какую не хочет закрываццо smile 
PM MAIL WWW ICQ   Вверх
ptr
Дата 6.7.2006, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Код

    if (feof(fp)) { printf("We have reached end-of-file\n"); fclose(fp); };
   } while (!feof(fp));

Ты закрываешь файл до того как проверяешь условие !feof(fp), поэтому оно и не выполняется. Делай fclose(fp) после цикла.

Цитата(Rockie @  5.7.2006,  19:39 Найти цитируемый пост)
похоже рекомендуют использовать строки (string.h). кто может подсказать грамотное преобразование string в int?
p.s.: вообще странно но я не нашел ничего вроде StrToInt из AnsiString  но для string.  

У std::string нет методов для преобразования. Можно сделать так:
Код

atoi(str_num.c_str());
 

Это сообщение отредактировал(а) ptr - 6.7.2006, 06:28


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Rockie
Дата 6.7.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(ptr @  6.7.2006,  05:55 Найти цитируемый пост)
atoi(str_num.c_str());

спасибо, хорошее решение. 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
ReGeDiT
Дата 6.7.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ptr, спасибо ))
осталось нерешено только 2 вопроса:

почему в файле не пишется имя (*name)
Код

SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE >> BUYPRICE || IN = 0 NM = (null) BP = 29 SP = 58 DF = 29
SELLPRICE >> BUYPRICE || IN = 0 NM = (null) BP = 80 SP = 200 DF = 120
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE == BUYPRICE || IN = 0 NM = (null) BP = 1 SP = 1 DF = 0
SELLPRICE >> BUYPRICE || IN = 0 NM = (null) BP = 84490 SP = 96898 DF = 12408

и как сделать определение ID предмета
Код

    if (strncmp(st,"[item",5)==0)       {
    vl0 = atoi(strstr(st,"m")+3);
    printf("[item %d]\n",vl0);            };

smile 
PM MAIL WWW ICQ   Вверх
ReGeDiT
Дата 7.7.2006, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



smile неужели никто не знает? smile
и кстати, при выводе, выводится всё до пробела 
PM MAIL WWW ICQ   Вверх
ptr
Дата 7.7.2006, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Цитата(ReGeDiT @  6.7.2006,  19:40 Найти цитируемый пост)
почему в файле не пишется имя (*name)

Старая програма такого файла не генерит. Выложи новый вариант. Кстати а зачем в ней 
Код

char *name[99];
 По-моему можно было обойтись и одним указателем.

Цитата(ReGeDiT @  6.7.2006,  19:40 Найти цитируемый пост)
и как сделать определение ID предмета

Можешь, например, получать из файла так:
Код

fscanf(fp,"[item %d]\n",&id);

или из строки:
Код

sscanf(st,"[item %d]\n",&id);
    

Это сообщение отредактировал(а) ptr - 7.7.2006, 18:45


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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